包含先前创建的变量的列表中存在问题。分配前引用的局部变量'Victory'错误



我有曲棍球比赛的胜利、平局、失败变量。显然,根据游戏的最终结果,这些变量中只有一个是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')

最新更新