请教,为什么 'a'<'b'<'c' 在 python3 中也返回 True? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
glasswm
V2EX    Python

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

  •  
  •   glasswm 2020 年 3 月 7 日 5515 次点击
    这是一个创建于 2150 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python3 中一般不同类型的比较会返回 exception

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

    但 'a'<'b'<'c' 返回了 True,这是什么原因呢?
    第 1 条附言    2020 年 3 月 7 日
    结贴。

    现象:'a'<'b'<'c' 在 python2.7、3 中均返回 True ( 2.7 以下版本未测试)
    原因:'a'<'b'<'c' 等价于 'a'<'b' and 'b'<'c'

    https://github.com/satwikkansal/wtfpython
    上面这个 repo 中还有更多好玩的。
    30 条回复    2020-3-08 09:34:16 +08:00
    pabupa
        2
    pabupa  
       2020 年 3 月 7 日 via Android   1
    没什么原因,语法糖。
    a<b and b<c
    lsvih
        3
    lsvih  
       2020 年 3 月 7 日   1
    'a'<'b'<'c' equal to 'a'<'b' and 'b'<'c'
    yzlnew
        4
    yzlnew  
       2020 年 3 月 7 日   3
    ('a'<'b')<'c' = True < 'c' -> TypeError
    'a'<'b'<'c' = 'a'<'b' and 'b'<'c' = True and True = True
    masker
        5
    masker  
       2020 年 3 月 7 日 via Android
    ASCII 码学过没
    littlewing
        7
    littlewing  
       2020 年 3 月 7 日   1
    'a'<'b'<'c' 在 py 中等价于 'a' < 'b' and 'b' < 'c',并不是 ('a' < 'b') < 'c'
    glasswm
        8
    glasswm  
    OP
       2020 年 3 月 7 日
    还是各位熟悉的姿势多。

    补充问一下,这个在 python2 也适用吗?
    metamask
        9
    metamask  
       2020 年 3 月 7 日   1
    https://github.com/satwikkansal/wtfpython

    可以参看这个

    ========


    另外,从类型角度来说,

    >>> isinstance(True, int)
    True

    所以假如你比较

    >>> 1 < True
    False

    是可以的
    metamask
        10
    metamask  
       2020 年 3 月 7 日   1
    @masker #5

    内容看清楚没
    J0G57faC6uPo75W0
        11
    J0G57faC6uPo75W0  
       2020 年 3 月 7 日
    ( 'a'<'b')<'c' 和 'a'<('b'<'c')
    因为运算符的优先级, 先计算括号内的表达式, 然后将表达式的结果再做计算.

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

    而 'a'<'b'<'c' 是 py 的语法糖, 和楼上说的一样 'a'<'b'<'c' equal to 'a'<'b' and 'b'<'c'
    glasswm
        12
    glasswm  
    OP
       2020 年 3 月 7 日 via Android
    @freakxx 这个 repo 有意思。
    deplives
        13
    deplives  
       2020 年 3 月 7 日
    ('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
        14
    Buges  
       2020 年 3 月 7 日 via Android
    这语法糖有意思,Python 果然优雅
    loading
        15
    loading  
       2020 年 3 月 7 日 via Android
    语法糖,先还原语法糖。
    str 比较,ascii,得到两个 bool 类型,都是 true
    最后两个 true,得出 true。
    loading
        16
    loading  
       2020 年 3 月 7 日 via Android
    如果加括号,就会变成一个 bool <'str'
    两边的类型不同了。

    语法糖我最讨厌了。
    masker
        17
    masker  
       2020 年 3 月 7 日
    @freakxx 排除语法糖,剩下的不就是 str 与 boolean 的比较了?XD
    kidlj
        18
    kidlj  
       2020 年 3 月 7 日 via iPhone
    这语法糖…感到不适
    a719114136
        19
    a719114136  
       2020 年 3 月 7 日 via Android
    怎么这么多人扯到语法糖,这和语法糖有啥关系。
    a<b<c 这种语法从 c 开始就有了,只是有的语言不支持而已。
    0ZXYDDu796nVCFxq
        20
    0ZXYDDu796nVCFxq  
       2020 年 3 月 7 日
    如果是 1 < a < 100 这种可以接受
    'a'<'b'<'c' 这种字符串比较加语法糖真讨厌
    wangyzj
        21
    wangyzj  
       2020 年 3 月 7 日 via iPhone
    ascii 和语法糖
    lijialong1313
        22
    lijialong1313  
       2020 年 3 月 7 日
    @a719114136 c 好像 a<b<c 是等价于(a<b)<c 的吧,那时候就有 a<b<c 等价于 a<b 且 b<c 了吗
    zhpech
        23
    zhpech  
       2020 年 3 月 7 日
    语法糖
    NeinChn
        24
    NeinChn  
       2020 年 3 月 7 日
    @gstqc
    C 没有这种语法,只是写起来后根据运算规则顺次运算,比如 3<4<2 在 C 里面是 true,跑的是( 3<4)<2 = 1 < 2 = true
    在 python 里面是 false,因为是( 3<4) && (4<2)
    ipwx
        25
    ipwx  
       2020 年 3 月 7 日   1
    “凡是我常用语言没有的,别的语言有的,都是别的语言搞出来的语法糖,我都不喜欢。”

    讲道理,非程序员看到这个语法可能觉得它非常自然。a < b < c 等价于 (a < b) < c 还要考虑 a<b 返回类型是个 bool,这才叫不自然呢。
    ipwx
        26
    ipwx  
       2020 年 3 月 7 日
    不信你们楼上的随便街上抓一个高中生,让他评判一下 0.1 < 0.2 < 0.3,是不是觉得挺自然的?在 C 里面这样写,怕不是报错就是 false。
    hxse
        27
    hxse  
       2020 年 3 月 7 日
    因为实际上比较的是
    ord('a') < ord('b') < ord('c')
    junkun
        28
    junkun  
       2020 年 3 月 7 日   1
    @glasswm 适用。这个语法糖是很早就有的,但我也不知道是哪个版本开始的,至少 2.7 是有的。
    glasswm
        29
    glasswm  
    OP
       2020 年 3 月 7 日
    @junkun 我也测试确认了下,的确如此。

    2.7 中
    0.5<0.8<0.9 -> True
    (0.5<0.8)<0.9 -> False
    tairan2006
        30
    tairan2006  
       2020 年 3 月 8 日 via Android
    这不是 py2 就有的语法糖么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5795 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 02:05 PVG 10:05 LAX 18:05 JFK 21:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86