我有曲棍球比赛的胜利、平局、失败变量。显然,根据游戏的最终结果,这些变量中只有一个是True。出于这个原因,我在一次尝试中创建了它们,除了:通过。
现在,我只想打印其中一个变量(True变量,例如Victory,因为Victory基于曲棍球比赛结果的抓取而变为True(,但当我搜索打印True变量时,我会得到错误UnboundLocalError: local variable 'Victory' referenced before assignment
,因为在分配之前已经命名了Victory。考虑到问题的简单性,我只报告对解决问题有用的部分:
也许我不应该使用列表
#scraping and assignment of Point_Team_A and Point_Team_B
...
try:
Victory = Point_Team_A > Point_Team_B
Draw = Point_Team_A == Point_Team_B
Lose = Point_Team_A < Point_Team_B
except:
pass
result=[Victory, Draw, Lose] #great problem is here
print (*filter(None, result), sep='n') #and here
例如,如果结果是胜利,我想得到输出:Victory
注意:我使用try/except,因为在胜利、平局和失败之间只有一(1(个变量为True。这两个False变量将被识别为错误,因为我之前在if/else条件中创建了Point_Team_A和Point_Teal_B。随后,我使用Point_Team_A和B创建上面的3个变量。例如,如果曲棍球比赛的结果是7-3,则意味着a队已经获胜,因为胜利=Point_team_a>Point_Team_B。因此,Draw和Lose将被Python识别为错误,因此使用try/except。
只做
if a_points > b_points:
print('victory')
elif a_points == b_points:
print('draw')
else:
print('defeat')
当你的代码正常工作时,实际上只会打印True
如果你想用另一种方法来重现你看到的错误,试试这个:
def f():
try:
x = 1 / 0
except ZeroDivisionError:
pass
print(x)
发生的情况是,python解释器知道名称x
存在于作用域中,但它从未绑定到任何东西(因为异常发生在赋值之前(。所以你得到了UnboundLocalError
Python变量分为两类:全局和局部。如果变量是在文件范围中定义的,则它是全局的。相反,局部变量是在python块中定义的变量。所谓python块,我指的是引入由缩进(特别是函数定义(分隔的新代码块的任何python构造
与其他语言(例如C++(不同,可以从外部范围访问本地python变量。这通常会引发UnboundLocalError异常。考虑以下代码:
def check_age(age):
if age < 18:
info = 'too young'
elif age > 18:
info = 'too old'
return info
check_age()
在使用值18调用之前运行良好。因为当age
为18时,check_age()
中的条件语句都没有定义info
的值,所以当用值18调用函数时,info
不会有值(未绑定(。因此,稍后通过return语句访问info
会引发UnboundLocalError
在您的特定情况下,try
定义了一个新的块(或范围(,您可以在其中对几个变量执行一些赋值。您稍后可以在封闭范围中访问这些变量。UnboundLocalError
的唯一明显原因是在try
块内(特别是在第一行(引发异常,该异常被except
块中的pass
静音,导致Victory
未被分配值。因此,尝试通过list = [Victory, Draw, Lose]
访问Victory
会引发所述异常。这可能意味着传递给try
块中第一行的>
运算符的值存在问题。可能至少有一个值没有定义运算符。
底线是检查您的抓取数据,以确保您传递了正确的值。
当try块中出现异常时,在try块内创建的变量在外部try块中将不可用,因此创建一个变量并在外部try块或内部(除外(对其进行初始化
Victory = Draw = Lose = False
try:
Victory = Point_Team_A > Point_Team_B
Draw = Point_Team_A == Point_Team_B
Lose = Point_Team_A < Point_Team_B
except:
pass
result=[Victory, Draw, Lose]
print (*filter(None, result), sep='n')