V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Mar 7, 2020 · 5644 views
    This topic created in 2242 days ago, the information mentioned may be changed or developed.
    python3 中一般不同类型的比较会返回 exception

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

    但 'a'<'b'<'c' 返回了 True,这是什么原因呢?
    Supplement 1  ·  Mar 7, 2020
    结贴。

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

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

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

    可以参看这个

    ========


    另外,从类型角度来说,

    >>> isinstance(True, int)
    True

    所以假如你比较

    >>> 1 < True
    False

    是可以的
    metamask
        10
    metamask  
       Mar 7, 2020   ❤️ 1
    @masker #5

    内容看清楚没
    J0G57faC6uPo75W0
        11
    J0G57faC6uPo75W0  
       Mar 7, 2020
    ( '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
       Mar 7, 2020 via Android
    @freakxx 这个 repo 有意思。
    deplives
        13
    deplives  
       Mar 7, 2020
    ('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  
       Mar 7, 2020 via Android
    这语法糖有意思,Python 果然优雅
    loading
        15
    loading  
       Mar 7, 2020 via Android
    语法糖,先还原语法糖。
    str 比较,ascii,得到两个 bool 类型,都是 true
    最后两个 true,得出 true。
    loading
        16
    loading  
       Mar 7, 2020 via Android
    如果加括号,就会变成一个 bool <'str'
    两边的类型不同了。

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

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

    2.7 中
    0.5<0.8<0.9 -> True
    (0.5<0.8)<0.9 -> False
    tairan2006
        30
    tairan2006  
       Mar 8, 2020 via Android
    这不是 py2 就有的语法糖么
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5666 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 08:21 · PVG 16:21 · LAX 01:21 · JFK 04:21
    ♥ Do have faith in what you're doing.