嵌套函数中的Python本地名称

嵌套函数中的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]

我在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]
        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()