在python中引用函数内部而不使用' global '关键字时出错



为什么下面的代码会引发一个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定义的。