为什么下面的代码会引发一个UnboundedLocalError
:
n = 0
def foo():
n = n + 1
print(n)
foo()
foo()
错误:
Traceback (most recent call last):
File "foo.py", line 5, in <module>
foo()
File "foo.py", line 3, in foo
n = n + 1
UnboundLocalError: local variable 'n' referenced before assignment
而下面的代码可以工作:
n = 0
def foo():
print(n)
foo()
foo()
输出:
0
0
在我看来,给定第二个代码片段的行为,第一个代码片段应该使用全局n
的值来计算n+1
,并将其分配给一个新的本地n
,并打印它。因此,我希望输出是两个1
。为什么这种情况没有发生?
一旦您编写了n = ...
,n
就成为整个函数作用域的局部变量。要使名称n
引用全局变量,必须使用global
语句。
在第二个示例中,没有对n
赋值,因此n
是未定义的。这是一个自由的变量,它的值将取自最近的封闭作用域,其中n
是定义的。