请教,为什么 'a'<'b'<'c' 在 python3 中也返回 True?

2020-03-07 10:52:29 +08:00
 glasswm
python3 中一般不同类型的比较会返回 exception

比如( 'a'<'b')<'c' 和 'a'<('b'<'c') 都会返回 TypeError: '<' not supported between instances of 'bool' and 'str'

但 'a'<'b'<'c' 返回了 True,这是什么原因呢?
5058 次点击
所在节点    Python
30 条回复
ispinfx
2020-03-07 10:56:26 +08:00
pabupa
2020-03-07 10:56:47 +08:00
没什么原因,语法糖。
a<b and b<c
lsvih
2020-03-07 10:56:48 +08:00
'a'<'b'<'c' equal to 'a'<'b' and 'b'<'c'
yzlnew
2020-03-07 10:58:21 +08:00
('a'<'b')<'c' = True < 'c' -> TypeError
'a'<'b'<'c' = 'a'<'b' and 'b'<'c' = True and True = True
masker
2020-03-07 10:59:16 +08:00
ASCII 码学过没
aguesuka
2020-03-07 10:59:27 +08:00
littlewing
2020-03-07 11:01:06 +08:00
'a'<'b'<'c' 在 py 中等价于 'a' < 'b' and 'b' < 'c',并不是 ('a' < 'b') < 'c'
glasswm
2020-03-07 11:05:19 +08:00
还是各位熟悉的姿势多。

补充问一下,这个在 python2 也适用吗?
freakxx
2020-03-07 11:25:25 +08:00
https://github.com/satwikkansal/wtfpython

可以参看这个

========


另外,从类型角度来说,

>>> isinstance(True, int)
True

所以假如你比较

>>> 1 < True
False

是可以的
freakxx
2020-03-07 11:25:50 +08:00
@masker #5

内容看清楚没
Tomotoes
2020-03-07 11:39:27 +08:00
( 'a'<'b')<'c' 和 'a'<('b'<'c')
因为运算符的优先级, 先计算括号内的表达式, 然后将表达式的结果再做计算.

上例中, 表达式返回为 boolean 类型, 如果将其与 字符串类型比较, 肯定是报类型错误异常的.

而 'a'<'b'<'c' 是 py 的语法糖, 和楼上说的一样 'a'<'b'<'c' equal to 'a'<'b' and 'b'<'c'
glasswm
2020-03-07 12:22:12 +08:00
@freakxx 这个 repo 有意思。
deplives
2020-03-07 12:32:35 +08:00
('a'<'b')<'c' 和 'a'<('b'<'c') 出错的原因是 ('a'<'b') 和 ('b'<'c') 的结果是 True 或者 False 是个 bool 类型,然后你拿 bool 类型和一个字符串比较, 那自然会 not supported between instances of 'bool' and 'str'
而 'a'<'b'<'c' 是因为 等于 'a'<'b' and 'b'<'c'
Buges
2020-03-07 12:36:25 +08:00
这语法糖有意思,Python 果然优雅
loading
2020-03-07 12:37:22 +08:00
语法糖,先还原语法糖。
str 比较,ascii,得到两个 bool 类型,都是 true
最后两个 true,得出 true。
loading
2020-03-07 12:38:45 +08:00
如果加括号,就会变成一个 bool <'str'
两边的类型不同了。

语法糖我最讨厌了。
masker
2020-03-07 12:56:39 +08:00
@freakxx 排除语法糖,剩下的不就是 str 与 boolean 的比较了?XD
kidlj
2020-03-07 13:15:43 +08:00
这语法糖…感到不适
a719114136
2020-03-07 13:42:23 +08:00
怎么这么多人扯到语法糖,这和语法糖有啥关系。
a<b<c 这种语法从 c 开始就有了,只是有的语言不支持而已。
0ZXYDDu796nVCFxq
2020-03-07 14:02:48 +08:00
如果是 1 < a < 100 这种可以接受
'a'<'b'<'c' 这种字符串比较加语法糖真讨厌

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

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

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

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

© 2021 V2EX