2 回答
TA贡献1809条经验 获得超8个赞
这是你给的代码。
a = 1
b = 1
c = 2
if a == b == c == 1:
print('All equal!')
else:
print('At least one variable is not equal to others')
让我们了解它的含义。仅当它们三个都等于 时才a==b==c==1计算为. 否则评估为。被评估为。True1Falsea==b==ca==b and b==c and c==a
为了得到你想要的,你必须这样做。
if a==b==c==1:
print('All are equal')
elif (a==b) or (b==c) or (c==a):
print('At least one variable is not equal to others')
else:
print('none of them are equal')
现在分析您提供的第二个字节码。
a = 1;b =2;c =1.5
a<b<c
a<b<c被评估为a<b and b<c在你的情况下 this is 1<2 and 2<1.5which is 被评估为False. 1<2被评估为True并且2<1.5被评估为False。True and假假is evaluated to`。
字节码:
In [2]: a=1;b=2;c=1.5
In [3]: dis.dis('a<b and b<c')
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 COMPARE_OP 0 (<)
6 JUMP_IF_FALSE_OR_POP 14
8 LOAD_NAME 1 (b)
10 LOAD_NAME 2 (c)
12 COMPARE_OP 0 (<)
>> 14 RETURN_VALUE
6 JUMP_IF_FALSE_OR_POP 14这行告诉我们的是如果为假则跳转到第 14 行。在逻辑 and False and any_bool_value上总是计算为False。
现在 if 6 JUMP_IF_FALSE_OR_POP 14is Truethen 它继续执行8到14.
在单个表达式中使用多个布尔运算符是安全的。
TA贡献1853条经验 获得超6个赞
from 0to 8it 比较a < b,at10检查其是否False,如果是 go to 18,则旋转堆栈,弹出顶部值,即False,因为a<b<cis a<b and b<c,所以如果第一个值为False,则不需要检查第二个条件。
但在这种情况下a < b == True,它会继续。此时它已经通过了第一个检查点 ( 10),它知道第一个条件必须是True,所以它返回条件中的任何值b < c,即False,所以你得到False。
相反,如果您检查 'a
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 COMPARE_OP 0 (<)
6 JUMP_IF_TRUE_OR_POP 14
8 LOAD_NAME 1 (b)
10 LOAD_NAME 2 (c)
12 COMPARE_OP 0 (<)
>> 14 RETURN_VALUE
它做相反的事情,检查 ( 6) 如果第一个条件是True,如果是,则下一个条件的计算结果无关紧要并返回值,否则,返回下一个条件的计算结果。
添加回答
举报