为什么 Python 不允许将全局变量分配给同名的局部变量?

Why doesn't Python allow assigning a global variable to a local one with the same name?

我理解要求global背后的逻辑,如果一个全局变量被分配给一个函数, 但我不明白为什么不能这样做:

y = 0
def x():
    y = y
    # Now modify the local version, but not the global one

调用 x 会产生 UnboundLocalError,即使这里没有歧义:由于 y 未定义,赋值的右侧应计算为全局变量执行时在本地范围内。

这个问题类似于(没有任何详细的答案),但更多的是关于语言设计背后的推理。

我不会写那样的代码,因为它很混乱,但我不明白为什么语言会禁止它。这似乎与全局变量(或 nonlocals)通常在 python.

中的行为不一致

当在赋值语句的 left-hand 端使用变量名时,Python 创建一个局部变量。当局部变量与全局变量同名时,我们说 local 隐藏了 global。影子表示全局变量不能被Python访问,因为局部变量会被先找到。

您在函数内部对 y 使用赋值语句。

Python 解释器在模块加载时看到了这一点,并决定全局作用域的 y 不应该在局部作用域内使用,这会导致在您尝试在局部变量之前引用该变量时出现问题已分配。

这就是您需要添加

的原因
y=0
def x():
    global y
    y=y
x()

这将告诉 Python 您不打算在函数的局部范围内定义 y 变量。 Python 解释器在模块加载时看到这一点,并决定在全局范围内查找对上述变量的任何引用。

虽然这是不使用全局变量的几个很好的理由之一。如您所见,它会使您的代码变得混乱和难以理解,应该避免在代码中这样做。我建议添加一个 全局关键字 只是为了巩固对 python 在这里如何工作的理解。