首页 > 解决方案 > 为什么未触发的赋值会改变“非本地”行为?

问题描述

今天我正在阅读 python 更改日志并遇到 nonlocal 关键字并对其进行了一些实验。我发现了一个令人困惑的情况,即未触发的赋值会改变nonlocal关键字的行为,请参见下面的示例。

def a():
    x = 'a'
    def b():
        def c():
            nonlocal x
            x = 'c'
        c()
    b()
    print(x)

a()

>>> python3 test.py
c


def a():
    x = 'a'
    def b():
        def c():
            nonlocal x
            x = 'c'
        c()
        if False:
            x = 'b'
    b()
    print(x)

a()

>>> python3 test2.py
a

您可以在 中看到test2.py,有一个未触发的分配x = 'b'改变了非本地的行为。

为什么会这样?

标签: pythonpython-3.xpython-nonlocal

解决方案


Python在编译时决定哪些变量是函数的本地变量。x被分配到函数内部b,所以它是本地的。在运行时实际上从未到达该分支是无关紧要的,并且通常无法确定。

因此,非本地的 in 是外部范围中的下x一个,即 in 。cxb

替代方案会更令人惊讶 - 考虑一下如果if False:改为is 会发生什么if rand(10) == 6:。然后在第一次调用b非局部变量时会引用最外面的变量,但在稍后调用b它时会随机开始引用另一个!


推荐阅读