Python “的结果”;a是a是“a”;比较

Python “的结果”;a是a是“a”;比较,python,Python,结果: A = 314 if A == A == A: print('True #1') if A == A == 271: print('True #2') lie = 0 if lie is lie is lie: print('no matter how white, how small,') print('how incorporating of a smidgeon') print('of truth there be in it.')

结果:

A = 314

if A == A == A:
    print('True #1')

if A == A == 271:
    print('True #2')

lie = 0
if lie is lie is lie:
    print('no matter how white, how small,')
    print('how incorporating of a smidgeon')
    print('of truth there be in it.')
我知道在if语句中使用两个“=”s和“is”s是不正常的。但是我想知道Python解释器是如何设置
if
语句的


表达式是同时解释的还是短路解释的?

它将被解释为:

True #1
no matter how white, how small,
how incorporating of a smidgeon
of truth there be in it.

你所遇到的被称为操作员链接

从以下文件:


比较可以任意链接,例如<强> <代码> x p>这个问题已经有很多答案,但是考虑到字节码的函数:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"
这表明所有的
谎言
都被检查,看它们是否匹配,以线性方式。如果一个失败了,它应该断开/返回

要确认,请考虑:

def f():
    lie = 0
    if lie is lie is lie:
        print('Lie')

dis.dis(f)

  2           0 LOAD_CONST               1 (0)
              2 STORE_FAST               0 (lie)
  3           4 LOAD_FAST                0 (lie)
              6 LOAD_FAST                0 (lie)
              8 DUP_TOP
             10 ROT_THREE
             12 COMPARE_OP               8 (is)
             14 JUMP_IF_FALSE_OR_POP    22
             16 LOAD_FAST                0 (lie)
             18 COMPARE_OP               8 (is)
             20 JUMP_FORWARD             4 (to 26)
        >>   22 ROT_TWO
             24 POP_TOP
        >>   26 POP_JUMP_IF_FALSE       36
  4          28 LOAD_GLOBAL              0 (print)
             30 LOAD_CONST               2 ('Lie')
             32 CALL_FUNCTION            1
             34 POP_TOP
        >>   36 LOAD_CONST               0 (None)
             38 RETURN_VALUE

“同时”是什么意思?我猜它被解释为只使用不同的运算符(和操作数)。有趣的问题,但几乎可以肯定是一个重复,运算符链接以前一定被问过。三重非“同时”,我的意思是“谎言是谎言”返回“真”,然后“真是谎言”,这可能会失败。根据回复,我理解它被解释为“谎言就是谎言,谎言就是谎言”。我以前没有试过阅读字节码。了解它是如何工作的是很有用的。。。。除非第三个
lie
将不会进行第二次评估。或者可能
lie0=lie1=lie2=0;如果lie0是lie1,而lie1是lie2
,则稍微澄清哪个是哪个。
def f():
    lie = 0
    if lie is lie is lie:
        print('Lie')

dis.dis(f)

  2           0 LOAD_CONST               1 (0)
              2 STORE_FAST               0 (lie)
  3           4 LOAD_FAST                0 (lie)
              6 LOAD_FAST                0 (lie)
              8 DUP_TOP
             10 ROT_THREE
             12 COMPARE_OP               8 (is)
             14 JUMP_IF_FALSE_OR_POP    22
             16 LOAD_FAST                0 (lie)
             18 COMPARE_OP               8 (is)
             20 JUMP_FORWARD             4 (to 26)
        >>   22 ROT_TWO
             24 POP_TOP
        >>   26 POP_JUMP_IF_FALSE       36
  4          28 LOAD_GLOBAL              0 (print)
             30 LOAD_CONST               2 ('Lie')
             32 CALL_FUNCTION            1
             34 POP_TOP
        >>   36 LOAD_CONST               0 (None)
             38 RETURN_VALUE
>lie is lie is lie is lie is lie 
True
>lie is not lie is lie is lie is lie is lie
False
>lie is lie is lie is lie is lie is not lie
False