在Python中从双重嵌套函数访问变量

5 投票
3 回答
2248 浏览
提问于 2025-04-15 19:26

下面的代码:

x = 0
print "Initialization: ", x
def f1():
    x = 1
    print "In f1 before f2:", x
    def f2():
        global x
        x = 2
        print "In f2:          ", x
    f2()
    print "In f1 after f2: ", x
f1()
print "Final:          ", x

输出结果是:

Initialization:  0
In f1 before f2: 1
In f2:           2
In f1 after f2:  1
Final:           2

有没有办法让 f2 访问 f1 的变量呢?

3 个回答

0

去掉 global 语句:

>>> x
0
>>> def f1():
    x = 1
    print(x)
    def f2():
        print(x)
    f2()
    print(x)


>>> f1()
1
1
1

如果你想在 f1 函数里 改变 变量 x 的值,那么你需要在每个函数里都使用 global 语句。

6

在Python 3中,你可以在f2函数里把x定义为nonlocal,这样就可以使用外层函数f1里的x了。

而在Python 2中,你不能直接在f2里给f1的x赋值。不过,你可以读取x的值和访问它的成员。所以可以用这种方法来解决这个问题:

def f1():
    x = [1]
    def f2():
        x[0] = 2
    f2()
    print x[0]
f1()
6

你可以访问这些变量,但问题在于赋值。在Python 2中,没有办法把x重新绑定到一个新值。想了解更多,可以查看PEP 227(嵌套作用域)。

在Python 3中,你可以使用新的nonlocal关键字,代替global。想了解更多,可以查看PEP 3104

撰写回答