[ Python ] 1 != 0 > 0 为什么会是 false?

2018-05-28 10:49:25 +08:00
 ihaveadrame
如题,前两天有人问我这个题没答对。尴尬,查漏补缺吧。希望看到的大牛帮忙解惑~谷歌失败后,一脸正经的发帖。
5287 次点击
所在节点    Python
35 条回复
VYSE
2018-05-28 11:39:45 +08:00
@ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断
karllynn
2018-05-28 11:59:59 +08:00
链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿
mayne95
2018-05-28 12:09:13 +08:00
前 6 楼全歪了,什么鬼。V 站不是这个水平吧🤣
ihaveadrame
2018-05-28 12:23:12 +08:00
@VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。
ihaveadrame
2018-05-28 12:25:26 +08:00
@yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教
Rob007
2018-05-28 17:08:19 +08:00
>>int(1 !=0 ) > 0
>>True
ytmsdy
2018-05-28 17:11:38 +08:00
“茴” 字有几种写法??
wfd0807
2018-05-28 17:51:05 +08:00
py 的链式比较,哈哈,我非 pythoner 都知道。。。
laoyur
2018-05-28 18:31:04 +08:00
@yazoox
> 楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿......

这口气,就你是大牛,问这个问题就是菜逼,对不对?
copie
2018-05-28 18:53:04 +08:00
In [2]: dis.dis("a!=b>b")
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 3 (!=)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_NAME 1 (b)
14 COMPARE_OP 4 (>)
16 RETURN_VALUE
>> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE

上面是 Python 运行时的字节码;然后我们来解释一下每一行什么意思
LOAD_NAME a 可以理解将 a 压入运行时栈 运行第一行后的栈 a,......|
运行第二行后的栈 b,a,......|
DUP_TOP 可以理解为把栈顶复制一份重新压入栈 运行第三行后的栈 b,b,a,......|
ROT_THREE 可以理解为把原来栈顶放到第三个位
置,把原来二放到第一个位置,把原来第三放到第二位
置 运行第四行后的栈 b,a,b......|
COMPARE_OP 这个就是进行 != 运算,将 b 弹出然后
获取 a 得到比较结果 res 后设置栈顶 运行第五行后的栈 res,b......|
如果 res 是 false 就跳到 18
运行第七行后的栈 b(后一个 b), b,......|
copie
2018-05-28 19:00:10 +08:00
接着 30 楼(不小心点回复了)
...................................................................运行第八行后的栈 res,.........
运行九局行返回结果 res
然后我们接着看 18
运行 18 之前的 栈 res,b,........|
运行 18 之后的 栈 b,res,........|
运行 20 之后的 栈 res,............|
然后返回 res

看完上面的运行步骤我们可以看到.
如果是一个"a>b>c" 这样的运算 Python 会理解为
a>b and b>c
param
2018-05-29 00:33:43 +08:00
3 < 4 > 1 #True
( 3 < 4) > 2 #False
还有这种事?
param
2018-05-29 00:33:57 +08:00
3 < 4 > 1 #True
( 3 < 4) > 1 #False
还有这种事?
lunafreya
2018-05-29 03:51:23 +08:00
@chengluyu
感谢,涨姿势了
stanfordwang
2018-05-29 09:39:09 +08:00
涨知识了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX