Python - 在赋值之前引用的局部变量应该遮蔽范围外的变量
Python - local variable referenced before assignment for variable that should shadow one outside of scope
此代码无效(UnboundLocalError: local variable 'x' referenced before assignment
):
x = 5
def thing():
x = x + 1
thing()
这个可以(只将 x
更改为 i
):
x = 5
def thing():
i = x + 1
thing()
我预计第一个会创建一个名为 x
的新变量,其值为 6(保持外部变量不变),这就是第二个中的 i
例子。这里发生了什么?
似乎在范围内第一次创建变量时,它会检查它是否存在于任何外部范围内,如果已经找到则引发错误,如果已经找到则引发错误。
现在,我的问题是,这样做的目的是什么?
Python 不允许您使用相同的符号来指代两个不同的变量。 x
是 global
,在这种情况下,您必须在函数的开头声明 global x
(然后两次出现的 x
都引用函数内部的全局变量) ;或者不是,在这种情况下,您在 x + 1
中引用的 x
尚未定义。
以一种奇怪的方式,你的推理是有道理的,至少在这个小玩具示例中是这样,但应该很容易看出你假设的语义对于任何更大的代码块中的人来说是如何灾难性地难以理解的许多变数。
此代码无效(UnboundLocalError: local variable 'x' referenced before assignment
):
x = 5
def thing():
x = x + 1
thing()
这个可以(只将 x
更改为 i
):
x = 5
def thing():
i = x + 1
thing()
我预计第一个会创建一个名为 x
的新变量,其值为 6(保持外部变量不变),这就是第二个中的 i
例子。这里发生了什么?
似乎在范围内第一次创建变量时,它会检查它是否存在于任何外部范围内,如果已经找到则引发错误,如果已经找到则引发错误。
现在,我的问题是,这样做的目的是什么?
Python 不允许您使用相同的符号来指代两个不同的变量。 x
是 global
,在这种情况下,您必须在函数的开头声明 global x
(然后两次出现的 x
都引用函数内部的全局变量) ;或者不是,在这种情况下,您在 x + 1
中引用的 x
尚未定义。
以一种奇怪的方式,你的推理是有道理的,至少在这个小玩具示例中是这样,但应该很容易看出你假设的语义对于任何更大的代码块中的人来说是如何灾难性地难以理解的许多变数。