Python中为什么 1 != 0 > 0 的结果是 false?

如题,前两天有人问我这个题没答对。尴尬,查漏补缺吧。希望看到的大牛帮忙解惑~谷歌失败后,一脸正经的发帖。
Python中为什么 1 != 0 > 0 的结果是 false?

36 回复

>
(1 != 0) > 0
1 != (0 > 0)


这个问题的关键在于Python的比较运算符优先级和链式比较。

在Python中,比较运算符(>, <, ==, !=, >=, <=)的优先级相同,并且支持链式比较。表达式 1 != 0 > 0 会被解释为 1 != 0 and 0 > 0,而不是 (1 != 0) > 0

让我们分解一下:

  1. 0 > 0 的结果是 False
  2. 所以整个表达式变成了 1 != 0 and False
  3. 1 != 0True
  4. 最终结果是 True and False,也就是 False

如果你想要的是 (1 != 0) > 0,那结果会是 True > 0,在Python中 True 等于 1,所以 1 > 0True

# 验证一下
print(1 != 0 > 0)          # False - 被解释为 1 != 0 and 0 > 0
print((1 != 0) > 0)        # True  - 显式使用括号
print(1 != 0 and 0 > 0)    # False - 等价于第一个表达式

总结:注意比较运算符的链式特性。

(1 != 0) &gt; 0 1 != (0 &gt; 0)

嘿~怎么都没格式呀

运算符优先级

< <= > >= 优先于 != ==

>>> print 1 != (0 > 0)
True
>>> print (1 != 0) > 0
True
>>> print 1 != 0 > 0
False

那按照你说的 结果不应该是 true 吗?
你用你理解的优先级 告诉我你的答案
这个运行的结果,所以才有了这个主题

搜的姿势不对,搜「 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。

看这个

感谢~ (づ ̄ 3  ̄)づ

涨姿势~

这个应该等价于 1!=0 and 0>0

这跟运算优先级没关系, 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

1 != 0 > 0
<=>
1 != 0 && 0 > 0

#7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说


#8 天呐还有这种特性?所以是:
>>> print 1 != 0 > 0
False
>>> print (1 != 0) and (0 > 0)
False
跪了

所以就可以写连等 a < b < c < d < e < f 了。

https://docs.python.org/2/reference/expressions.html#comparisons

总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行

这里我根据 提供的信息 “ x<y<=z 当 优先级高的运算出现了 false,比较就会终止返回 false ” 。结合本题 1 != 0 > 0 这里 > 运算符优先级最高,因此 顺序排列后是 0 > 0 != 1 因为第一次比较就出现了 false,所以直接返回 false。

1 != 0 > 0 等价于 1!=0 and 0>0

楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿…

#18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断

链式比较吧,py 的一个特性,写成10 &gt; a &gt; 11可能更容易想起来这个玩意儿

前 6 楼全歪了,什么鬼。V 站不是这个水平吧🤣

没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。

怎么说呢 你觉得是就是了~ 虚心接受指教

>>int(1 !=0 ) > 0
>>True

“茴” 字有几种写法??

py 的链式比较,哈哈,我非 pythoner 都知道。。。


> 楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿…

这口气,就你是大牛,问这个问题就是菜逼,对不对?

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,…|

接着 30 楼(不小心点回复了)
…运行第八行后的栈 res,…
运行九局行返回结果 res
然后我们接着看 18
运行 18 之前的 栈 res,b,…|
运行 18 之后的 栈 b,res,…|
运行 20 之后的 栈 res,…|
然后返回 res

看完上面的运行步骤我们可以看到.
如果是一个"a>b>c" 这样的运算 Python 会理解为
a>b and b>c

3 < 4 > 1 #True
( 3 < 4) > 2 #False
还有这种事?

3 < 4 > 1 #True
( 3 < 4) > 1 #False
还有这种事?


感谢,涨姿势了

涨知识了

回到顶部