zoukankan      html  css  js  c++  java
  • Python 函数内变量的作用域

    Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.

    全局作用域(global):即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。

    全局变量可以在函数内部访问,不能修改,修改想要修改可以用globa来装饰变量

    注意:全局作用域的作用范围仅限于单个模块文件内.

    >>> x = 1          #定义一个变量
    >>> def fun():    
    	y=3
    	print (x,y)   #定义一个函数,这个函数会调用变量x
    
    	
    >>> fun()               #调用函数      
    1 3
    >>> def fun(): 
    	y=3
    	x+=1            #这个函数会修改变量x
    	print (x,y)
    
    	
    >>> fun()         #此时调用函数时就会报错。
    Traceback (most recent call last):
      File "<pyshell#85>", line 1, in <module>
        fun()
      File "<pyshell#84>", line 3, in fun
        x+=1
    UnboundLocalError: local variable 'x' referenced before assignment
    >>> def fun():
    	y=3
    	global x      #声明这个 x 变量为全局变量,相当于授权。
    	x+=1          #这个函数会修改变量x
    	print (x,y)
    
    	
    >>> fun()      #成功调用函数
    2 3
    >>> 
    
    >>> y     #函数中的y是无法访问的,因为y是局部变量
    Traceback (most recent call last):
      File "<pyshell#89>", line 1, in <module>
        y
    NameError: name 'y' is not defined
    >>> def fun():
    	global y        #给局部变量y授权,类似出国签证。
    	y=3
    	global x
    	x+=1
    	print (x,y)
    
    	
    >>> fun()        #调用函数
    3 3
    >>> y               #可以访问变量y
    3
    >>> 
    


    nonlocal函数:当里层局部,需要修改外层局部变量时,需要使用nonlocal。这个和全局变量不同,无法在函数体以外调用。

    >>> def fun():      #这个函数里面内嵌一个函数
    	q =1
    	print('局部变量:',q)
    	def fun1():
    		w=2
    		print('内嵌函数局部外层变量:',q)    #调用上一级函数的局部变量
    		print('内嵌函数局部里层变量:',w)
    	fun1()   #执行函数fun()时会自动调用函数fun1()
    
    	
    >>> fun()   #查看结果,调用函数fun()时会自动调用函数fun1()。
    局部变量: 1
    内嵌函数局部外层变量: 1
    内嵌函数局部里层变量: 2
    >>> def fun():
    	q =1
    	print('局部变量:',q)
    	def fun1():
    		w=2
    		q+=1    #调用上一级函数的局部变量q,并且修改这个 变量。
    		print('内嵌函数局部外层变量:',q)
    		print('内嵌函数局部里层变量:',w)
    	fun1()
    
    	
    >>> fun()         #因为此时局部变量q不能被内嵌函数调用,目前还没有没有授权
    局部变量: 1
    Traceback (most recent call last):
      File "<pyshell#109>", line 1, in <module>
        fun()
      File "<pyshell#108>", line 9, in fun
        fun1()
      File "<pyshell#108>", line 6, in fun1
        q+=1
    UnboundLocalError: local variable 'q' referenced before assignment
    >>> def fun():
    	q =1
    	print('局部变量:',q)
    	def fun1():
    		w=2
    		nonlocal q    #使用nonlocal授权,允许内嵌函数fun1()可以调用变量q
    		q+=1
    		print('内嵌函数局部外层变量:',q)
    		print('内嵌函数局部里层变量:',w)
    	fun1()
    
    	
    >>> fun()
    局部变量: 1
    内嵌函数局部外层变量: 2
    内嵌函数局部里层变量: 2
    >>> 
    
    >>> q   #因为这个局部变量q,只是在内嵌函数fun1()里面使用了nonlocal 进行了授权,所以在fun1()以外时无法调用的。
    Traceback (most recent call last):
      File "<pyshell#114>", line 1, in <module>
        q
    NameError: name 'q' is not defined
    

      

      

     

  • 相关阅读:
    STM32Cube IDE配置串口发送与接收
    STM32CubeIDE Debug Configurations
    STM32CubeMX FreeRTOS定时器的使用
    单片机处理串口逗号分隔符命令
    自定义任务状态来操作FreeRTOS任务的挂起,恢复,删除
    Halcon WPF C#采集图像区域灰度值
    STM32CubeMX FreeRTOS no definition for "osThreadGetState" 解决办法
    Hyper-V应用
    AutoFixture 数据对象生成器
    visual studio的XAML无法热更新
  • 原文地址:https://www.cnblogs.com/longxd/p/8729440.html
Copyright © 2011-2022 走看看