Python作用域问题
我有一个简单的例子:
def func1():
local_var = None
def func(args):
print args,
print "local_var:", local_var
local_var = "local"
func("first")
func("second")
func1()
我希望输出是:
first local_var: None second local_var: local
但是,我实际得到的输出是:
first local_var: Traceback (most recent call last): File "test.py", line 13, in func1() File "test.py", line 10, in func1 func("first") File "test.py", line 6, in func print "local_var:", local_var UnboundLocalError: local variable 'local_var' referenced before assignment
我对Python作用域规则的理解是,这应该按预期工作。我还有其他代码是正常工作的,但把一个不工作的代码片段简化到上面的简单例子时也不行。所以我很困惑。
4 个回答
1
在3.0版本之前,解决这个问题的标准方法是
def func1():
local_var = [None]
def func(args):
print args,
print "local_var:", local_var[0]
local_var[0] = "local"
func("first")
func("second")
func1()
1
这里讨论了Python的作用域规则,相关内容可以在这个问题中找到:
9
在func
里给local_var
赋值,这个变量就变成了func
内部的局部变量——所以在print
语句中引用这个“非常非常局部”的变量时,它还没有被赋值,这就是异常提示的意思。正如jtb所说,在Python 3中,你可以用nonlocal
来解决这个问题,但从你的代码和print
语句来看,你是在用Python 2。Python 2的传统解决办法是确保赋值不是给一个简单的变量名,这样就不会让这个变量变得比你想要的更局部,比如:
def func1():
local_var = [None]
def func(args):
print args,
print "local_var:", local_var[0]
local_var[0] = "local"
func("first")
func("second")
func1()
这里的索引赋值不是给一个简单的变量名,因此不会影响变量的局部性。而且自从Python 2.2以来,嵌套的内部函数可以引用外部函数中的局部变量,这就是这个版本所做的(给简单变量名赋值和引用变量是两个不同的问题)。