从词汇范围界定的Google Style Guide开始:
A nested Python function can refer to variables defined in enclosing functions, but can not assign to them.
这两种情况在一开始似乎都得到了证实:
# Reference
def toplevel():
a = 5
def nested():
print(a + 2)
nested()
return a
toplevel()
7
Out[]: 5
# Assignment
def toplevel():
a = 5
def nested():
a = 7 # a is still 5, can't modify enclosing scope variable
nested()
return a
toplevel()
Out[]: 5
那么,为什么嵌套函数中引用和赋值的组合会导致异常呢?在
^{pr2}$
在第一种情况下,您引用的是
nonlocal
变量,这是正常的,因为没有称为a
的局部变量。在在第二种情况下,创建一个局部变量}没有被更改)。在
^{pr2}$a
,这也很好(局部a
将与非本地变量不同,这就是为什么原始的{在第三种情况下,您创建了一个局部变量,但在此之前有
print(a+2)
,这就是引发异常的原因。因为print(a+2)
将引用在该行之后创建的局部变量a
。在要实现您想要的,您需要在内部函数中使用
nonlocal a
:对于任何遇到这个问题的人,除了这里公认的答案之外,它在Python docs中得到了简洁的回答:
相关问题 更多 >
编程相关推荐