记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
好吧~~~~~~~