我有一个简单的例子:
def func1():
local_var = None
def func(args):
print args,
print "local_var:", local_var
local_var = "local"
func("first")
func("second")
func1()
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
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范围规则的理解要求它应该按预期工作.我有其他代码,这可以按预期工作,但减少一个非工作代码片段到它上面的小部分情况也不起作用.所以我很难过.
对local_varin 的赋值func使它成为本地的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()
Run Code Online (Sandbox Code Playgroud)
索引的赋值不是一个简单名称,因此不影响局部性,并且从Python 2.2开始,嵌套内部函数引用外部包含函数中的本地变量是完全可以接受的,这是所有这个版本所做的(分配给裸名是一个与引用变量不同的问题).
| 归档时间: |
|
| 查看次数: |
712 次 |
| 最近记录: |