来看看这个 Python 基础题你会么?谁能帮我解释一下,真心没明白

2017-08-02 19:19:17 +08:00
 altboy

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

3396 次点击
所在节点    Python
18 条回复
wellsc
2017-08-02 19:27:10 +08:00
建议了解一下运算符优先级
BBrother
2017-08-02 19:28:49 +08:00
python 里 0 == False, 1 == True.
lxml
2017-08-02 19:29:45 +08:00
括号优先计算
>>> 2==2
0
>>> 1<0
False
lxml
2017-08-02 19:30:26 +08:00
@lxml #3 更正,括号优先计算
>>> 2==2
1
>>> 1<1
False
Patrick95
2017-08-02 19:30:39 +08:00
是类型隐式转换的问题。

Python 中,除了‘’、""、0、()、[]、{}、None 转 bool 类型为 False
其他转换基本都为 True
111111111111
2017-08-02 19:31:48 +08:00
第一个 ,首先 2==2 结果是 1,所以 1<1 是 False
第二个,你先理解(1<2<3) is True, (4>2<3) is True
可以理解成先比较 1<2,再比较 2==2,所以结果是 True
iVeego
2017-08-02 19:33:54 +08:00
@lxml #4 print(1<2 ==2) 这句话,1<2 是 True,应该是 1,所以转换成 print(1==2),不是这样吗?
llb123
2017-08-02 19:33:56 +08:00
第二个类似于 1<2 and 2==2
altboy
2017-08-02 19:35:19 +08:00
@111111111111 感谢,懂了
iVeego
2017-08-02 19:35:21 +08:00
@lxml #3 我看了
@111111111111 #6 的解释,明白了。
lonelinsky
2017-08-02 19:36:18 +08:00
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

注意比较的时候是把运算符右边的类型转为左边的类型,然后再行比较。
ivechan
2017-08-02 19:41:07 +08:00
@lonelinsky 你这个解释是错的, True == 2,得出来的是 False.
#6 的解释才是对的.
不得不说这个问题确实很有趣..
altboy
2017-08-02 19:41:38 +08:00
@lonelinsky 这个解释我刚开始以为对了,往解释器里一放 True==2 然后就尴尬了。。。
lonelinsky
2017-08-02 19:46:50 +08:00
@lonelinsky #11 更正,上面的说法是错误的,1 < 2 == 2 和 (1 < 2) == 2 是不一样的, 这个应该其实是 Python 的一个语法糖,为了简化 (b > a and b < c) , 可以直接写做 ( a < b < c); 所以题目的 1 < 2 == 2 其实就是 (1 < 2 and 2 == 2)
=。=
lonelinsky
2017-08-02 19:48:50 +08:00
@ivechan #12
@altboy #13

嗯,是我想当然了,实际上应该是我 14 刚才写的这样的 =。=
ivechan
2017-08-02 19:57:45 +08:00
不得不说这个问题确实"装"到很多人, 看似简单的问题, 但是却被很多人用 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, 一个非常好的问题和一个明白人.
zuanzi
2017-08-03 08:33:14 +08:00
学到了
altboy
2017-08-03 08:42:18 +08:00
@ivechan 感谢,为老哥搞技术的这股韧劲点赞

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

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

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

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

© 2021 V2EX