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
。由于您在使用它之前分配了这个值,所以很好。您分配 4
的 x
是 f2
本地的 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' 的不同变量已被分配,并没有改变这一点。
我知道 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
。由于您在使用它之前分配了这个值,所以很好。您分配 4
的 x
是 f2
本地的 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' 的不同变量已被分配,并没有改变这一点。