python 嵌套函数变量作用域

python nested function variable scope

我知道 nonlocal 关键字以及如何修复此错误,但我在下面的代码中遇到了我不理解的行为。如果你运行这个,就没有问题

def test( root):
        x=2
        def f2(r):
            print("***")
            x=r #Adding this line is ok
            print("----",x)
        f2(root)
        return x
test(4)

现在尝试将 x=r 更改为 f2 中的最后一行不起作用,如下所示

def test( root):
        x=2
        def f2(r):
            print("***")
            print("----",x)
            x=r #Gives an error "local variable 'x' referenced before assignment"
        f2(root)
        return x
test(4)

谢谢

问题出在第 5 行,您在 print("----",x) 中打印了 x, 它不知道 f2 函数中的 x 所以你不能打印它

如果你想在 f2() 中使用那个 x=2 你应该将它传递给它,或者使用全局密钥或...

在第一个示例中,您分配了一个新的局部变量 x,它独立于外部作用域中的 x。由于您在使用它之前分配了这个值,所以很好。您分配 4xf2 本地的 x,这就是为什么当您从 test return x 时,它是原始 2 值。

在第二个例子中,你做了同样的事情,分配了一个新的局部变量 x(这导致外部作用域的 x 被隐藏,和以前一样),但是这次你在你实际做作业之前参考它。这就是产生错误的原因。

如果你根本没有分配 x,那么它就不会被遮蔽,你将能够 print 从外部范围(意味着你会看到它的值)值为 2,而不是 4):

>>> def test( root):
...         x=2
...         def f2(r):
...             print("***")
...             print("----",x)
...         f2(root)
...         return x
...
>>> test(4)
***
---- 2
2

您在两个不同的范围内有两个名为 'x' 的变量。我不建议这样做;它会导致很多混乱,导致程序中出现错误。

我不建议使用关键字来解决这个问题。重命名其中一个变量。如果这样做,错误就会变得清楚。

def test( root):
        x_test=2
        def f2(r):
            print("***")
            print("----",x_f2)
            x_f2=r 
        f2(root)
        return x_test
test(4)

显然,x_f2 在赋值前被引用。当你这样写代码的时候,错误就很明显了。

正是您的代码所做的;只是不清楚,因为您有两个在不同范围内具有相同名称的变量。

f2里面的'x'是函数中的局部变量,赋值前不能使用。事实上,在外部作用域中有一个名为 'x' 的不同变量已被分配,并没有改变这一点。