Python 3:UnboundLocalError:赋值前引用的局部变量[重复]

k7fdbhmy  于 2023-06-25  发布在  Python
关注(0)|答案(5)|浏览(136)

此问题已在此处有答案

UnboundLocalError trying to use a variable (supposed to be global) that is (re)assigned (even after first use)(14个回答)
Using global variables in a function(25个答案)
7年前关闭。
下面的代码给出错误UnboundLocalError: local variable 'Var1' referenced before assignment

  1. Var1 = 1
  2. Var2 = 0
  3. def function():
  4. if Var2 == 0 and Var1 > 0:
  5. print("Result 1")
  6. elif Var2 == 1 and Var1 > 0:
  7. print("Result 2")
  8. elif Var1 < 1:
  9. print("Result 3")
  10. Var1 -= 1
  11. function()

我该怎么解决这个问题?

0s7z1bwu

0s7z1bwu1#

这是因为,即使Var1存在,您也在函数内部对名称Var1使用赋值语句(Var1 -= 1在底部行)。自然地,这在函数的作用域内创建了一个名为Var1的变量(实际上,-=+=只会更新(重新分配)现有变量,但由于未知原因(可能在此上下文中是一致的),Python将其视为赋值)。Python解释器在模块加载时看到这一点,并决定(正确地)全局作用域的Var1不应该在局部作用域中使用,这会导致在变量被局部赋值之前尝试引用变量时出现问题。
Python开发人员通常不赞成在不必要的情况下使用全局变量,因为它会导致代码混乱和有问题。然而,如果你想使用它们来完成你的代码所暗示的,你可以简单地在函数的顶部添加,****:

  1. global Var1, Var2

这将告诉Python,你不打算在函数的局部作用域中定义Var1Var2变量。Python解释器在模块加载时看到这一点,并决定(正确地)在全局范围内查找对上述变量的任何引用。

部分资源

  • Python网站对这个常见问题有很好的解释。
  • Python 3提供了一个相关的nonlocal语句--也可以看看。
vhipe2zx

vhipe2zx2#

如果你在函数内部设置了一个变量的值,python会把它理解为创建了一个同名的局部变量。这个局部变量屏蔽了全局变量。
在你的例子中,Var1被认为是一个局部变量,并且在设置之前使用它,因此错误。
为了解决这个问题,你可以通过在你的函数中放入global Var1来明确地说它是一个全局变量。

  1. Var1 = 1
  2. Var2 = 0
  3. def function():
  4. global Var1
  5. if Var2 == 0 and Var1 > 0:
  6. print("Result One")
  7. elif Var2 == 1 and Var1 > 0:
  8. print("Result Two")
  9. elif Var1 < 1:
  10. print("Result Three")
  11. Var1 =- 1
  12. function()
qyuhtwio

qyuhtwio3#

您可以通过传递参数而不是依赖于Globals来解决这个问题

  1. def function(Var1, Var2):
  2. if Var2 == 0 and Var1 > 0:
  3. print("Result One")
  4. elif Var2 == 1 and Var1 > 0:
  5. print("Result Two")
  6. elif Var1 < 1:
  7. print("Result Three")
  8. return Var1 -= 1
  9. function(1, 1)
pjngdqdw

pjngdqdw4#

我不喜欢这种行为,但这就是Python的工作方式。其他人已经回答了这个问题,但为了完整起见,让我指出Python 2有更多这样的怪癖。

  1. def f(x):
  2. return x
  3. def main():
  4. print f(3)
  5. if (True):
  6. print [f for f in [1, 2, 3]]
  7. main()

Python 2.7.6返回一个错误:

  1. Traceback (most recent call last):
  2. File "weird.py", line 9, in <module>
  3. main()
  4. File "weird.py", line 5, in main
  5. print f(3)
  6. UnboundLocalError: local variable 'f' referenced before assignment

Python发现f[f for f in [1, 2, 3]]中被用作局部变量,并决定它也是f(3)中的局部变量。你可以添加一个global f语句:

  1. def f(x):
  2. return x
  3. def main():
  4. global f
  5. print f(3)
  6. if (True):
  7. print [f for f in [1, 2, 3]]
  8. main()

它确实有效;然而,* f在结尾变成了3... * 也就是说,print [f for f in [1, 2, 3]]现在将全局变量f更改为3,因此它不再是一个函数。
幸运的是,在print中添加括号后,它在Python3中运行良好。

展开查看全部
krcsximq

krcsximq5#

为什么不简单地返回计算值,让调用者修改全局变量。在函数中操作全局变量不是一个好主意,如下所示:

  1. Var1 = 1
  2. Var2 = 0
  3. def function():
  4. if Var2 == 0 and Var1 > 0:
  5. print("Result One")
  6. elif Var2 == 1 and Var1 > 0:
  7. print("Result Two")
  8. elif Var1 < 1:
  9. print("Result Three")
  10. return Var1 - 1
  11. Var1 = function()

或者甚至创建全局变量的本地副本并使用它们并返回调用者可以适当分配的结果

  1. def function():
  2. v1, v2 = Var1, Var2
  3. # calculate using the local variables v1 & v2
  4. return v1 - 1
  5. Var1 = function()
展开查看全部

相关问题