
1 pabupa 2018-05-28 10:53:18 +08:00 > (1 != 0) > 0 1 != (0 > 0) |
2 pabupa 2018-05-28 10:54:40 +08:00 `(1 != 0) > 0 ` `1 != (0 > 0)` |
3 pabupa 2018-05-28 10:55:04 +08:00 嘿~怎么都没格式呀 |
4 lianyue 2018-05-28 10:56:11 +08:00 运算符优先级 |
5 Kiriz 2018-05-28 10:57:08 +08:00 via iPhone < <= > >= 优先于 != == |
6 U7Q5tLAex2FI0o0g 2018-05-28 11:01:41 +08:00 >>> print 1 != (0 > 0) True >>> print (1 != 0) > 0 True >>> print 1 != 0 > 0 False |
7 ihaveadrame OP |
8 chengluyu 2018-05-28 11:06:41 +08:00 搜的姿势不对,搜「 python chained comparision 」就可以搜到结果了: > Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false). 摘自 https://docs.python.org/3/reference/expressions.html 的 6.10 Comparisions。 |
9 menc 2018-05-28 11:07:47 +08:00 |
10 ihaveadrame OP @chengluyu 感谢~ (づ ̄ 3  ̄)づ |
11 ihaveadrame OP @menc 涨姿势~ |
12 jmc891205 2018-05-28 11:10:50 +08:00 这个应该等价于 1!=0 and 0>0 |
13 VYSE 2018-05-28 11:11:15 +08:00 这跟运算优先级没关系, PY 这点比较 tricky, 转换后实际是 1 != 0 and 0 > 0, 加括号后才当算数运算. https://stackoverflow.com/questions/18528431/what-is-the-meaning-of-true-true-false-in-python-and-how-to-find-out |
14 whoami9894 2018-05-28 11:11:21 +08:00 via Android 1 != 0 > 0 <=> 1 != 0 && 0 > 0 |
15 U7Q5tLAex2FI0o0g 2018-05-28 11:11:52 +08:00 @ihaveadrame #7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说 @chengluyu #8 天呐还有这种特性?所以是: >>> print 1 != 0 > 0 False >>> print (1 != 0) and (0 > 0) False 跪了 |
17 xxxy 2018-05-28 11:18:42 +08:00 https://docs.python.org/2/reference/expressions.html#comparisons 总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行 |
18 ihaveadrame OP |
19 SuT2i 2018-05-28 11:23:58 +08:00 1 != 0 > 0 等价于 1!=0 and 0>0 |
20 yazoox 2018-05-28 11:34:13 +08:00 楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿...... |
21 VYSE 2018-05-28 11:39:45 +08:00 @ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断 |
22 karllynn 2018-05-28 11:59:59 +08:00 链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿 |
23 mayne95 2018-05-28 12:09:13 +08:00 via Android 前 6 楼全歪了,什么鬼。V 站不是这个水平吧 |
24 ihaveadrame OP @VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。 |
25 ihaveadrame OP @yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教 |
26 Rob007 2018-05-28 17:08:19 +08:00 >>int(1 !=0 ) > 0 >>True |
27 ytmsdy 2018-05-28 17:11:38 +08:00 “茴” 字有几种写法?? |
28 wfd0807 2018-05-28 17:51:05 +08:00 py 的链式比较,哈哈,我非 pythoner 都知道。。。 |
29 laoyur 2018-05-28 18:31:04 +08:00 |
30 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,......| |