You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python 3中if-else语句触发NameError问题求助

解决Python if/else链引发的NameError问题

嘿,我来帮你理清楚这个问题——你遇到的NameError本质是你要打印的变量spt根本没被定义过,因为你的代码执行时,根本没走到赋值spt的那个分支。

先拆解下你的代码执行流程:
你初始化的变量是ld=2rd=0hd=1vhd=1,程序会从上到下匹配第一个满足条件的分支:

  1. 第一个条件rd>=1?rd是0,不满足;
  2. 第二个条件hd>=1 and rd==0?hd是1,rd是0,完全满足!所以程序会执行st = 4*hd +2 = 6,然后直接跳出整个if/elif链,后面的所有分支(包括给spt赋值的分支)都不会再执行;
  3. 最后你打印spt,但这个变量从来没被创建过,自然就触发了NameError

另外你说期望输出4,这说明你的条件顺序或者目标变量可能搞混了——当前逻辑下,要么你选错了要打印的变量(比如应该打印st或者lt),要么你的条件优先级不符合你的预期。

给你两个针对性的解决方案:

方案1:统一结果变量,避免未定义问题

最稳妥的做法是用一个统一的变量存储结果,提前初始化它,这样不管走哪个分支,变量都不会缺失:

ld = 2
rd = 0
hd = 1
vhd = 1
result = None  # 提前初始化结果变量

if rd >= 1:
    result = 4 * rd + 2
elif hd >= 1 and rd == 0:
    result = 4 * hd + 2
elif ld >= 1 and rd == 0 and hd == 0:
    result = 4 * ld + 2
elif ld >= 1:
    result = 4 * ld
elif hd >= 1:
    result = hd
elif vhd >= 1:
    result = vhd
else:
    print('Error!')

print(result)

这样不管哪个分支被触发,result都会有值,彻底解决NameError。

方案2:调整条件顺序,匹配你的预期输出

如果你确实想让某个特定分支生效(比如得到你想要的4),就得调整条件的优先级。比如假设你想让hd的分支计算4*hd得到4,就可以修改分支的公式或者调整它的位置:

ld = 2
rd = 0
hd = 1
vhd = 1
result = None

if hd >= 1 and rd == 0:
    result = 4 * hd  # 修改公式得到4
elif rd >= 1:
    result = 4 * rd + 2
elif ld >= 1 and rd == 0 and hd == 0:
    result = 4 * ld + 2
elif ld >= 1:
    result = 4 * ld
elif hd >= 1:
    result = hd
elif vhd >= 1:
    result = vhd
else:
    print('Error!')

print(result)

小提示:

  • Python里if语句的括号是多余的,直接写if rd >= 1:更符合Python风格;
  • 分支里的表达式也不用额外加括号,比如rt = 4*rd + 2就足够清晰。

内容的提问来源于stack exchange,提问作者Preet Rajdeo

火山引擎 最新活动