python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
一 global
global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。
gcount = 0
def global_test():
gcount+=1
print (gcount)
global_test()
这里要修改全局变量gcount,但是没用使用global这个关键字。运行后
Traceback (most recent call last):
File "D:\pythonpro\globallocaltest.py", line 34, in <module>
global_test()
File "D:\pythonpro\globallocaltest.py", line 4, in global_test
gcount+=1
UnboundLocalError: local variable 'gcount' referenced before assignment
可以看到解释器将global_counter()函数中的gcount当做了局部变量。这里就用到了解释器引用变量的顺序。
在程序中设置的gcount属于全局变量,而在函数global_counter()中没有gcount的定义,根据python访问局部变量和全局变量的规则:当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样python就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR或者Unbound-LocalError,这取决于python版本。)
程序就会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错。
def global_counter():
global gcount
gcount +=1
return gcount
那么如果我们要在函数中访问全局变量并且修改它的值,应该怎么办。在c++中有作用域 操作符::。在python中是使用global关键字。
遇到在程序中访问全局变量并且要修改全局变量的值的情况可以使用:global关键字,在函数中声明此变量是全局变量
二 nonlocal
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
nonlocal是在Python3.0中新增的关键字,python2.x不提供支持def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
def make_counter_test():
mc = make_counter()
print(mc())
print(mc())
print(mc())