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