嵌套函数中的Python本地名称
我在nest函数中测试了局部变量, 我得到的错误代码如下:嵌套函数中的Python本地名称,python,Python,我在nest函数中测试了局部变量, 我得到的错误代码如下: # coding: utf-8 def func3(): x = [1, 2, 3] def func2(): print 'func2:', locals() x[0] += x[0] print 'func2:', locals() def func3(): print 'func3:', locals() x = x[0]
# coding: utf-8
def func3():
x = [1, 2, 3]
def func2():
print 'func2:', locals()
x[0] += x[0]
print 'func2:', locals()
def func3():
print 'func3:', locals()
x = x[0]
print 'func3:', locals()
func2()
print "-->", locals()
func3()
print "==>", locals()
if __name__ == '__main__':
func3()
我得到了一个错误:
func2: {'x': [1, 2, 3]}
func2: {'x': [2, 2, 3]}
--> {'func3': <function func3 at 0x1076adde8>, 'func2': <function func2 at 0x1076ad6e0>, 'x': [2, 2, 3]}
func3: {}
Traceback (most recent call last):
File "test.py", line 23, in <module>
func3()
File "test.py", line 19, in func3
func3()
File "test.py", line 13, in func3
x = x[0]
UnboundLocalError: local variable 'x' referenced before assignment
func2:{'x':[1,2,3]}
func2:{'x':[2,2,3]}
-->{'func3':,'func2':,'x':[2,2,3]}
func3:{}
回溯(最近一次呼叫最后一次):
文件“test.py”,第23行,在
func3()
func3中第19行的文件“test.py”
func3()
func3中第13行的文件“test.py”
x=x[0]
UnboundLocalError:赋值前引用了局部变量“x”
为什么func2
和func3
有不同的答案?在func3()
中,您试图修改外部范围中的变量。但是,您并没有说它不是局部变量,所以Python说在赋值之前引用了局部变量。要修改外部变量,需要将其声明为非局部变量(在Python3中):
但是,这在Python2中不起作用,因为非本地的不存在。一种解决方法是在外部func3()
和内部func3()
中声明x
全局
对于func2()
,实际上并不需要它,因为x[0]+=x[0]
实际上是x[0]的快捷方式。因为您可以引用x
,这就是您想要的。在func3()
中,您正在尝试修改外部范围中的变量。但是,您并没有说它不是局部变量,所以Python说在赋值之前引用了局部变量。要修改外部变量,需要将其声明为非局部变量(在Python3中):
但是,这在Python2中不起作用,因为非本地的不存在。一种解决方法是在外部func3()
和内部func3()
中声明x
全局
对于func2()
,实际上并不需要它,因为x[0]+=x[0]
实际上是x[0]的快捷方式。因为您可以引用x
,这就是您想要的。如果函数中有一个变量赋值,则会在该函数中创建一个局部变量,并且对相同名称的所有引用都假定是对该局部变量的引用。否则,对变量的引用被假定为转到外部范围
在func2
中,没有分配给x
(有分配给x[0]
,但这不是一回事)。因此,它指的是外部的x
,一切正常
但是,在func3
中有一个分配给x
。因此,该函数中的x
引用了该函数的局部新变量,而x=x[0]
是错误的,因为它试图从未初始化的变量读取
在Python3中,您可以将非局部x
放在func3
中,以分配给外部x
。在Python2中,没有简单的方法从外部非全局范围分配给变量。通常的解决方法是使用类似于func2
的索引或写入属性(x.attr=val
)。如果函数中有一个变量赋值,则在该函数中创建一个局部变量,并假定对相同名称的所有引用都指向该局部变量。否则,对变量的引用被假定为转到外部范围
在func2
中,没有分配给x
(有分配给x[0]
,但这不是一回事)。因此,它指的是外部的x
,一切正常
但是,在func3
中有一个分配给x
。因此,该函数中的x
引用了该函数的局部新变量,而x=x[0]
是错误的,因为它试图从未初始化的变量读取
在Python3中,您可以将非局部x
放在func3
中,以分配给外部x
。在Python2中,没有简单的方法从外部非全局范围分配给变量。通常的解决方法是使用类似于func2
的索引或写入属性(x.attr=val
)。x
不是全局的,它来自外部范围。而且func2
是正确的,没有添加任何global
或nonlocal
声明。@interjay我已经编辑了我的答案,但是你来得太早了27秒。请参阅我在全球
和非本地
上对我复出的另一个答案的评论。答案仍然是错误的func2
确实访问外部变量。@interjay:我承认这一次。我运行了代码,发现你是对的。然后我想到了原因。请参阅我编辑的答案。x
不是全局的,它来自外部范围。而且func2
是正确的,没有添加任何global
或nonlocal
声明。@interjay我已经编辑了我的答案,但是你来得太早了27秒。请参阅我在全球
和非本地
上对我复出的另一个答案的评论。答案仍然是错误的func2
确实访问外部变量。@interjay:我承认这一次。我运行了代码,发现你是对的。然后我想到了原因。请参阅我编辑的答案。
def func3():
nonlocal x
print 'func3:', locals()
x = x[0]
print 'func3:', locals()