Global关键字是什么?如何使用?
函数定义了本地作用域,而模块定义的是全局作用域。
如果想要在函数内定义全局作用域,需要加上global修饰符。
变量名解析:LEGB原则
当在函数中使用未认证的变量名时,Python搜索4个作用域
- [本地作用域(L)(函数内部声明但没有使用global的变量),
- 之后是上一层结构中def或者lambda的本地作用域(E),
- 之后是全局作用域(G)(函数中使用global声明的变量或在模块层声明的变量),
- 最后是内置作用域(B)(即python的内置类和函数等)]
并且在第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程中都没有找到,Python就会报错。
补:上面的变量规则只适用于简单对象,当出现引用对象的属性时,则有另一套搜索规则:属性引用搜索一个或多个对象,而不是作用域,并且有可能涉及到所谓的"继承"。
born = 1996
def how_old():
global born
this_year = 2018
age = this_year - born
print(age)
born = 1996
how_old()
这里的打印结果是22。也就是说函数在搜索本地作用域(born = 1995)之前获取了全局作用域。能否理解为global born相当于声明了本地作用域,只不过该本地作用域等同于全局作用域born?这样就可以解释为什么在搜索变量的步骤中领先于搜索本地作用域那一步。
如果直接赋值global对象,它是一个字典,长这样:
我这里要使用全局变量born,需要以字典的方式访问global对象:global[‘born’]