def foo():
m = 3
def bar():
print(m) # code 1
m=4 # code 2
bar()
foo()
UnboundLocalError: 在赋值之前,局部变量 'm' 被引用
为什么会出现 UnboundLocalError
?我知道 bar
不能改变 m
的值,但是它难道不应该只能获取 m
的值吗?
而且当我分别尝试代码 1/code 2
时,它们都可以正常工作。
def foo():
m = 3
def bar():
print(m) # code 1
m=4 # code 2
bar()
foo()
UnboundLocalError: 在赋值之前,局部变量 'm' 被引用
为什么会出现 UnboundLocalError
?我知道 bar
不能改变 m
的值,但是它难道不应该只能获取 m
的值吗?
而且当我分别尝试代码 1/code 2
时,它们都可以正常工作。
bar
有一个赋值m=4
,整个函数中的m
都被视为局部变量。但是在你调用print(m)
时,m
还没有被创建。因此,你会得到错误UnboundLocalError: local variable 'm' referenced before assignment
。
在Python 3中,你可以通过在内部作用域中声明m
为nonlocal
来修复代码。这避免了将m
放置在全局范围内(这也是在Python 2和3中使用global
关键字代替nonlocal
的选项)。以下代码适用于Python 3:
def foo():
m = 3
def bar():
nonlocal m
print(m) # code 1
m=4 # code 2
bar()
foo()
global
或者nonlocal
声明,那么这个变量是局部变量——即使在赋值之前的函数内部也是如此。 - jasonharper