首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前面创建的变量列表中的问题。分配前引用的错误局部变量“胜利”

前面创建的变量列表中的问题。分配前引用的错误局部变量“胜利”
EN

Stack Overflow用户
提问于 2022-04-01 05:34:33
回答 3查看 97关注 0票数 0

我赢了,平局,输了一场曲棍球比赛。显然,根据游戏的最终结果,这些变量中只有一个是True。出于这个原因,我在一次尝试中创建了它们,除了: pass。

现在,我只想打印这些变量中的一个(例如,胜利,因为胜利是基于对曲棍球比赛结果的刮取而变成真实的),但是当我搜索打印True变量时,我会得到错误UnboundLocalError: local variable 'Victory' referenced before assignment,因为胜利在分配之前已经命名了。鉴于问题的简单性,我只报告对决议有用的部分:

也许我不应该用单子

代码语言:javascript
复制
#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 /除非只有一个变量才是胜利者、平局、输家之间的真变量。这两个假变量将被识别为错误,因为我以前在if / Point_Team_B条件下创建了Point_Team_B。随后,我使用Point_Team_A和B来创建上面的3个变量。例如,如果一场曲棍球比赛的结果是7-3,那就意味着A队赢了,因为胜利= Point_Team_A> Point_Team_B。因此,Python会将平局和输球看作是一个错误。

EN

回答 3

Stack Overflow用户

发布于 2022-04-01 08:38:29

Python变量分为两类:全局本地。如果变量是在文件作用域中定义的,则该变量是全局的。相反,局部变量是在python块中定义的变量。对于python块,我指的是引入缩进分隔的新代码块的任何python构造(特别是函数定义)。

与其他语言(例如C++)不同,可以从外部范围访问本地python变量。这就是通常引发UnboundLocalError异常的原因。考虑以下代码:

代码语言:javascript
复制
def check_age(age):
    if age < 18:
        info = 'too young'
    elif age > 18:
        info = 'too old'
    
    return info    

check_age()可以正常工作,直到用值18调用为止。由于在UnboundLocalError为18时,check_age()中的任何条件语句都不定义info的值,因此在调用值18的函数时,info不会有一个值(未绑定)。

在您的特定情况下,try定义了一个新的块(或作用域),您可以在其中对几个变量执行一些赋值。稍后,您将在一个封闭范围内访问这些变量。UnboundLocalError try 块(特别是在第一行)中引发的异常,由 except 块中的 pass 沉默,导致E 243 Victory E 147不被分配值。因此,试图通过Victory list = [Victory, Draw, Lose] 访问会引发上述异常。这可能只意味着传递给>操作符的值在try块中的第一行存在问题。可能没有为至少一个值定义运算符。

底线是检查您刮过的数据,以确保您正在传递正确的值。

票数 1
EN

Stack Overflow用户

发布于 2022-04-01 05:56:58

就这么做

代码语言:javascript
复制
if a_points > b_points:
    print('victory')
elif a_points == b_points:
    print('draw')
else:
    print('defeat')

当代码正常工作时,实际上只会打印True

如果您想要另一种方法重现您所看到的错误,请尝试如下:

代码语言:javascript
复制
def f():
    try:
        x = 1 / 0
    except ZeroDivisionError:
        pass

    print(x)

所发生的事情是,python解释器知道名称x存在于作用域中,但它从未绑定到任何东西(因为异常发生在赋值之前)。所以你得到了UnboundLocalError

票数 -1
EN

Stack Overflow用户

发布于 2022-04-01 05:56:37

当try块中有异常时,在try块中创建的变量将在外部try块中不可用,因此创建一个变量并在外部try块或inside中初始化它。

代码语言:javascript
复制
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')
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71702238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档