Python基础题:谁能帮我解释一下这个题目?真心没明白

print(1<(2==2)) #False print(1<2 ==2) #True


Python基础题:谁能帮我解释一下这个题目?真心没明白
19 回复

建议了解一下运算符优先级


我无法理解你的问题

python 里 0 == False, 1 == True.

括号优先计算
>>> 2==2
0
>>> 1<0
False

#3 更正,括号优先计算
>>> 2==2
1
>>> 1<1
False

是类型隐式转换的问题。

Python 中,除了‘’、""、0、()、[]、{}、None 转 bool 类型为 False
其他转换基本都为 True

第一个 ,首先 2==2 结果是 1,所以 1<1 是 False
第二个,你先理解(1<2<3) is True, (4>2<3) is True
可以理解成先比较 1<2,再比较 2==2,所以结果是 True

#4 print(1<2 ==2) 这句话,1<2 是 True,应该是 1,所以转换成 print(1==2),不是这样吗?

第二个类似于 1<2 and 2==2

感谢,懂了

#3 我看了
#6 的解释,明白了。

  1. 1<(2==2)
    先算 2==2 为 True, 计算 1 < True 时,True 被转为数字类型,值为 1,1 < 1,为 False

    2. 1<2 ==2
    先算 1 < 2 为 True, 计算 True == 2 时,2 被转为 bool 类型,值为 True,True == True, 为 True

    注意比较的时候是把运算符右边的类型转为左边的类型,然后再行比较。

你这个解释是错的, True == 2,得出来的是 False.
#6 的解释才是对的.
不得不说这个问题确实很有趣…

这个解释我刚开始以为对了,往解释器里一放 True==2 然后就尴尬了。。。

#11 更正,上面的说法是错误的,1 < 2 == 2 和 (1 < 2) == 2 是不一样的, 这个应该其实是 Python 的一个语法糖,为了简化 (b > a and b < c) , 可以直接写做 ( a < b < c); 所以题目的 1 < 2 == 2 其实就是 (1 < 2 and 2 == 2)
=。=

#12
#13

嗯,是我想当然了,实际上应该是我 14 刚才写的这样的 =。=

不得不说这个问题确实"装"到很多人, 看似简单的问题, 但是却被很多人用 C\Java 等语法套用在 Python 上弄得混淆了.
为了弄清楚这个问题, 我去查了官方文档.
里面有两句话解释了这个问题:
“Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics:”
"Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z"
简而言之, 在 Python 里, < > 这种比较运算符更倾向于数学的表达方式, 并且遵循"链式"的规则.

举个例子, print(2<3>1)在 Python 是 True 的, 但是在 C 语言中却是"False"的.
原因就是在数学中(Python 使用的), 这个不等式是成立的, 但是在 C 语言中, 并没有这种"数学"规则,
C 语言中是这种顺序: 2<3 是 True 的, (或者更准确地说 2<3 返回的是一个非 0).但是在实现中, 一般是把 1 作为非 0 的替代,
也就是 1 代表 True,0 代表 False. 这样整个逻辑比较就变成 1>1,也就是 False.

PS: 感谢楼主和#6, 一个非常好的问题和一个明白人.

感谢,为老哥搞技术的这股韧劲点赞

回到顶部