为什么 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
未定义,赋值的右侧应计算为全局变量执行时在本地范围内。
这个问题类似于(没有任何详细的答案),但更多的是关于语言设计背后的推理。
我不会写那样的代码,因为它很混乱,但我不明白为什么语言会禁止它。这似乎与全局变量(或 nonlocal
s)通常在 python.
中的行为不一致
当在赋值语句的 left-hand 端使用变量名时,Python 创建一个局部变量。当局部变量与全局变量同名时,我们说 local 隐藏了 global。影子表示全局变量不能被Python访问,因为局部变量会被先找到。
您在函数内部对 y 使用赋值语句。
Python 解释器在模块加载时看到了这一点,并决定全局作用域的 y 不应该在局部作用域内使用,这会导致在您尝试在局部变量之前引用该变量时出现问题已分配。
这就是您需要添加
的原因
y=0
def x():
global y
y=y
x()
这将告诉 Python 您不打算在函数的局部范围内定义 y 变量。 Python 解释器在模块加载时看到这一点,并决定在全局范围内查找对上述变量的任何引用。
虽然这是不使用全局变量的几个很好的理由之一。如您所见,它会使您的代码变得混乱和难以理解,应该避免在代码中这样做。我建议添加一个 全局关键字 只是为了巩固对 python 在这里如何工作的理解。
我理解要求global
背后的逻辑,如果一个全局变量被分配给一个函数,
但我不明白为什么不能这样做:
y = 0
def x():
y = y
# Now modify the local version, but not the global one
调用 x
会产生 UnboundLocalError
,即使这里没有歧义:由于 y
未定义,赋值的右侧应计算为全局变量执行时在本地范围内。
这个问题类似于
我不会写那样的代码,因为它很混乱,但我不明白为什么语言会禁止它。这似乎与全局变量(或 nonlocal
s)通常在 python.
当在赋值语句的 left-hand 端使用变量名时,Python 创建一个局部变量。当局部变量与全局变量同名时,我们说 local 隐藏了 global。影子表示全局变量不能被Python访问,因为局部变量会被先找到。
您在函数内部对 y 使用赋值语句。
Python 解释器在模块加载时看到了这一点,并决定全局作用域的 y 不应该在局部作用域内使用,这会导致在您尝试在局部变量之前引用该变量时出现问题已分配。
这就是您需要添加
的原因y=0
def x():
global y
y=y
x()
这将告诉 Python 您不打算在函数的局部范围内定义 y 变量。 Python 解释器在模块加载时看到这一点,并决定在全局范围内查找对上述变量的任何引用。
虽然这是不使用全局变量的几个很好的理由之一。如您所见,它会使您的代码变得混乱和难以理解,应该避免在代码中这样做。我建议添加一个 全局关键字 只是为了巩固对 python 在这里如何工作的理解。