在 python 中不使用 `global` 关键字引用函数内部时出错
Error when referencing a inside a function without using `global` keyword in python
为什么以下代码会引发 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
在我看来,鉴于第二个片段的行为,第一个片段应该使用 global n
的值来计算 n+1
并将其分配给一个新的 local n
,然后打印出来。因此,我希望输出是两个 1
。为什么这不会发生?
只要你写了n = ...
,n
就变成了整个函数作用域的local变量。要使名称 n
引用 global 变量,您必须使用 global
语句。
在第二个例子中,n
没有赋值,所以n
是未定义的。这是一个 free 变量,它的值将从最近的封闭范围中获取,其中 n
是 定义的。
为什么以下代码会引发 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
在我看来,鉴于第二个片段的行为,第一个片段应该使用 global n
的值来计算 n+1
并将其分配给一个新的 local n
,然后打印出来。因此,我希望输出是两个 1
。为什么这不会发生?
只要你写了n = ...
,n
就变成了整个函数作用域的local变量。要使名称 n
引用 global 变量,您必须使用 global
语句。
在第二个例子中,n
没有赋值,所以n
是未定义的。这是一个 free 变量,它的值将从最近的封闭范围中获取,其中 n
是 定义的。