记python 链式比较的坑


前两天,python交流群里有人问:

“x”<"y"==True

这个表达式输出的是什么,脑子都没动,就觉得应该是True

居然被否定了!立马在命令行里敲了一下,准备用事实打对方脸。

But,是我的脸被打了,命令行给了我一个大大的False!!

这。。。。。。。。。。。。。。

'x'<'y'==True不就是('x'<'y')==True么??我哪里错了!

都不知道怎么去网上查去了!

幸亏最近学了一个新模块,dis

立马拿来强行装b.upper()

dis模块可以把python内容,转成字节码,也就是能看具体的底层动作

import dis
dis.dis("'x'<'y'==True")

dis.dis("('x'<'y')==True")

1.先来看下('x'<'y')==True"的dis反编译

1)加载x到栈,

2)加载y到栈,

3)进行比较操作

4)加载True到栈

5)进行比较操作

6)返回比较结果

感觉就应该是这样子么!

2.再来看看'x'<'y'==True的反编译

就是框起来的这两个段造的孽

1)加载x到栈

2)加载y到栈

3)DUP_TOP,这是什么神仙操作?

  查了一下手册:Duplicates the reference on top of the stack.复制堆栈顶部的引用。

  所以,此时栈内数据是x|y|y(左边是栈底;栈底是x,栈顶是刚刚复制的那个y)

4)ROT_THREE 把栈内第二和第三位置的值,向栈顶推一个位置,原栈顶移到第三的位置

  也就是此时栈内数据是y|x|y(左边是栈底;栈底是之前复制的那个y,栈顶是2)压入的y)

5)栈顶的x和y进行比较操作

6)跳转判断

7)加载True

8)栈顶的两个值进行‘==‘判断,也就是‘y’和True

  这怎么可能相等?!!!

也就是说,python里边的‘x’<'y'==True 等价于 'x'<'y' and 'y'==True

好吧~~~~~~~

相关