查看: 1864|回复: 3

Python 3: UnboundLocalError: local variable referenced before assignmentPytho...

[复制链接]

4

主题

11

帖子

39

积分

新手上路

Rank: 1

积分
39
发表于 2018-9-18 17:34:13 | 显示全部楼层 |阅读模式
运行以下代码
  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.     Var1 =- 1
  11. function()
复制代码

给出了错误
  1. UnboundLocalError: local variable 'Var1' referenced before assignment:
复制代码

我怎样才能解决这个问题?谢谢你的帮助!
回复

使用道具 举报

11

主题

80

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2018-9-18 17:35:23 | 显示全部楼层
可以通过传递参数而不是依赖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)
复制代码

回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 17:37:02 | 显示全部楼层
这是因为,即使Var1存在,你也在Var1函数内部的名称上使用赋值语句(Var1 -= 1在底行)。当然,这会在函数的范围内创建一个变量(实际上,Var1a -=或+=只会更新(重新分配)现有变量,但由于原因未知(可能是此上下文中的一致性),Python会将其视为赋值)。Python解释器在模块加载时看到这一点,并决定(正确地说)全局作用域Var1不应在本地作用域内使用,这会在您尝试在本地分配之前引用该变量时导致问题。
Python开发人员通常不赞成使用全局变量,因为它会导致令人困惑和有问题的代码。但是,如果你想使用它们来完成代码所暗示的内容,你只需添加:
global Var1, Var2
在你的功能顶部。这将告诉Python您不打算在函数的本地范围内定义Var1或Var2变量。Python解释器在模块加载时看到这一点并决定(正确地)以查找对全局范围中的上述变量的任何引用。
一些资源
•        Python网站对这个常见问题有很好的解释。
•        Python 3提供了一个相关的nonlocal声明 - 也可以检查一下。
回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 17:37:42 | 显示全部楼层
如果在函数内部设置变量的值,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()
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表