首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印(pole_a_wid,pole_b_wid) NameError:未定义名称“pole_a_wid”

打印(pole_a_wid,pole_b_wid) NameError:未定义名称“pole_a_wid”
EN

Stack Overflow用户
提问于 2022-03-05 17:50:39
回答 3查看 38关注 0票数 0

我正在尝试一些东西,但我遇到了一个问题( NameError: name 'pole_a_wid' is not defined )--这是我的代码:

代码语言:javascript
复制
    import random
    #Random Pole Height
    list = [11, 21, 9, 23, 13, 19, 27, 7]
    random_pole_wid = random.choice(list)
    if random_pole_wid == "11":
        pole_a_wid = 11
        pole_b_wid = 21
    elif random_pole_wid == "21":
        pole_a_wid = 21
        pole_b_wid = 11
    elif random_pole_wid == "9":
        pole_a_wid = 9
        pole_b_wid = 23
    elif random_pole_wid == "23":
        pole_a_wid = 23
        pole_b_wid = 9
    elif random_pole_wid == "13":
        pole_a_wid = 13
        pole_b_wid = 19
    elif random_pole_wid == "19":
        pole_a_wid = 19
        pole_b_wid = 13
    elif random_pole_wid == "27":
        pole_a_wid = 27
        pole_b_wid = 7
    elif random_pole_wid == "7":
        pole_a_wid = 7
        pole_b_wid = 27
    
    print(pole_a_wid,pole_b_wid)

这就是我得到的错误:

代码语言:javascript
复制
print(pole_a_wid,pole_b_wid) NameError: name 'pole_a_wid' is not defined 
EN

回答 3

Stack Overflow用户

发布于 2022-03-05 18:01:16

你没有“其他”的案子。您所检查的只是一堆相互排除的if -子句,但是如果不满足任何一种情况,您的代码就不会为值分配任何内容。

在本例中,您有一个包含int类型元素的列表,但是比较检查string,因此所有条件都是错误的。

使用这样的检查:random_pole_wid == 11:,它将工作。

编辑:通常情况下,您的代码包含8种不独立的情况,因为它们的4种情况是“镜像的”。您可以使代码更短、更易读,如下所示:

代码语言:javascript
复制
import random
# Random Pole Height
lst = [11, 21, 9, 23, 13, 19, 27, 7]  # generally you should avoid overwriting python builtins such as 'list' with your variable names as that can cause hard to debug behaviours!
pole_a_wid = random.choice(lst)

if pole_a_wid in [9, 23, 13, 19]:
    pole_b_wid = 32 - pole_a_wid
elif pole_a_wid in [11, 21]:
    pole_b_wid = 33 - pole_a_wid
elif pole_a_wid in [27, 7]:
    pole_b_wid = 34 - pole_a_wid

print(pole_a_wid, pole_b_wid)
票数 1
EN

Stack Overflow用户

发布于 2022-03-05 18:01:26

值列表包含整数。但你在检查字符串值。

因此,所有的if语句都不是真语句。

因此,这两个变量永远不会被定义。

票数 0
EN

Stack Overflow用户

发布于 2022-03-05 18:04:03

您的主要问题是,您的列表包含整数值,但您正在将它们与字符串进行比较。

另外,您要对7进行两次测试,而不是对11进行测试。当选择11时,您会得到相同的错误,因为您没有匹配任何内容,因此这些值仍未定义。您可能应该在条件之前将这两个值设置为“默认”值,或者添加一个最终的else子句来处理非匹配。即使您的代码不应该需要这种逻辑,您已经问过这个问题的事实表明,为什么显式地添加这样的logic...catching代码错误通常会使查找和诊断它们变得更容易。

下面是您的代码的一个修改版本,它说明了我前面说过的内容,并且应该按照您的意愿行事:

代码语言:javascript
复制
import random
# Random Pole Height
list = [11, 21, 9, 23, 13, 19, 27, 7]
random_pole_wid = random.choice(list)
if random_pole_wid == 11:
    pole_a_wid = 11
    pole_b_wid = 21
elif random_pole_wid == 21:
    pole_a_wid = 21
    pole_b_wid = 11
elif random_pole_wid == 9:
    pole_a_wid = 9
    pole_b_wid = 23
elif random_pole_wid == 23:
    pole_a_wid = 23
    pole_b_wid = 9
elif random_pole_wid == 13:
    pole_a_wid = 13
    pole_b_wid = 19
elif random_pole_wid == 19:
    pole_a_wid = 19
    pole_b_wid = 13
elif random_pole_wid == 27:
    pole_a_wid = 27
    pole_b_wid = 7
elif random_pole_wid == 7:
    pole_a_wid = 7
    pole_b_wid = 27
else:
    print(f"The chosen value '{random_pole_wid}' does not match any of the values being tested for")
    pole_a_wid = 0
    pole_b_wid = 0


print(pole_a_wid, pole_b_wid)

一个更为简洁、可读性和可维护性的解决方案是创建一个dict来描述数据值及其之间的关系。dict的键将是每个可以随机选择的数值,而dict的值将是与该选择相匹配的两个数字。就像这样:

代码语言:javascript
复制
import random
# Random Pole Height
list = [11, 21, 9, 23, 13, 19, 27, 7]
random_pole_wid = random.choice(list)

data = {
    11: (11, 21),
    21: (21, 11),
    9: (9, 23),
    23: (23, 9),
    13: (13, 19),
    19: (19, 13),
    27: (27, 7),
    7: (7, 27),
}

if random_pole_wid in data:
    pole_a_wid, pole_b_wid = data[random_pole_wid]
else:
    print("The chosen value is not one of the expected choices.")
    pole_a_wid, pole_b_wid = 0, 0

print(pole_a_wid, pole_b_wid)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71364547

复制
相关文章

相似问题

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