关于global 和 nonlocal你需要注意的问题
- 在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。
-
然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中,在函数中为一个变量赋值时,有下面这样一条规则:
当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量.
#示例一: a = 1 def foo(): b = a return b print(foo()) #结果: 1。 foo()内部没有定义1,它向上层找到了全局变量a #示例二: a = 1 def foo(): b = a a = 2 # newline return b print(foo()) #会报错 UnboundLocalError: local variable 'a' referenced before assignment #示例三: a = 1 def foo(): global a b = a a = 2 # newline return b print(foo()) #输出1。global关键字声明,foo()中的a即是全局变量a,后面的都是赋值语句。
nonlocal
#示例一: a = 1 def foo(): nonlocal a b = a a = 1 return b print(foo()) #SyntaxError: no binding for nonlocal 'a' found 表明nonlocal不能声明全局变量。 #示例二: def foo_upper(): a = 1 def foo(): nonlocal a b = a a = 1 return b print(foo()) foo_upper() #输出1