Python - 在为变量赋值之前引用的局部变量应该覆盖范围之外的一个

问题描述

代码不起作用 (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 不允许您使用相同的符号来引用两个不同的变量。要么 xglobal,在这种情况下,您必须在函数的开头声明 global x(然后 x 的两次出现都指的是函数内部的全局变量) ;或者不是,在这种情况下,您在 x 中引用的 x + 1 尚未定义。

以一种奇怪的方式,您的推理是有道理的,至少在这个小玩具示例中,但是应该很容易看出您假设的语义对于具有许多变量的更大代码块的人类来说是如何难以理解的.