Python—在赋值之前引用的局部变量,该变量应在作用域之外隐藏一个变量

Python—在赋值之前引用的局部变量,该变量应在作用域之外隐藏一个变量,python,scope,shadowing,Python,Scope,Shadowing,此代码不起作用(UnboundLocalError:赋值前引用的局部变量“x”): 这一个(仅将x更改为i): 我希望对于第一个变量,它将创建一个名为x的新变量,其值为6(保持外部变量不变),这就是第二个示例中的I。这是怎么回事? 当变量第一次在作用域中创建时,它会检查它是否存在于任何外部作用域中,如果已经找到,则会引发错误;如果已经找到,则会引发错误 现在,我的问题是,这样做的目的是什么?Python不允许您使用相同的符号来引用两个不同的变量。x是global,在这种情况下,您必须在函数开头声

此代码不起作用(
UnboundLocalError:赋值前引用的局部变量“x”):

这一个(仅将
x
更改为
i
):

我希望对于第一个变量,它将创建一个名为
x
的新变量,其值为6(保持外部变量不变),这就是第二个示例中的
I
。这是怎么回事? 当变量第一次在作用域中创建时,它会检查它是否存在于任何外部作用域中,如果已经找到,则会引发错误;如果已经找到,则会引发错误


现在,我的问题是,这样做的目的是什么?

Python不允许您使用相同的符号来引用两个不同的变量。
x
global
,在这种情况下,您必须在函数开头声明
global x
(然后
x
的两次出现都指函数内部的全局);或者不是,在这种情况下,您在
x+1
中引用的
x
尚未定义


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

还有一些有趣的含义:如果
x=[]
在外部定义,
x.append(0)
x+=[0]
不允许进入时工作。
x = 5
def thing():
    x = x + 1
thing()
x = 5
def thing():
    i = x + 1
thing()