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-03-07 10:52:29 +08:00 · 5057 次点击
    这是一个创建于 1753 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python3 中一般不同类型的比较会返回 exception

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

    但 'a'<'b'<'c' 返回了 True,这是什么原因呢?
    第 1 条附言  ·  2020-03-07 22:07:11 +08:00
    结贴。

    现象:'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-03-08 09:34:16 +08:00
    ispinfx
        1
    ispinfx  
       2020-03-07 10:56:26 +08:00   ❤️ 2
    pabupa
        2
    pabupa  
       2020-03-07 10:56:47 +08:00 via Android   ❤️ 1
    没什么原因,语法糖。
    a<b and b<c
    lsvih
        3
    lsvih  
       2020-03-07 10:56:48 +08:00   ❤️ 1
    'a'<'b'<'c' equal to 'a'<'b' and 'b'<'c'
    yzlnew
        4
    yzlnew  
       2020-03-07 10:58:21 +08:00   ❤️ 3
    ('a'<'b')<'c' = True < 'c' -> TypeError
    'a'<'b'<'c' = 'a'<'b' and 'b'<'c' = True and True = True
    masker
        5
    masker  
       2020-03-07 10:59:16 +08:00 via Android
    ASCII 码学过没
    littlewing
        7
    littlewing  
       2020-03-07 11:01:06 +08:00   ❤️ 1
    'a'<'b'<'c' 在 py 中等价于 'a' < 'b' and 'b' < 'c',并不是 ('a' < 'b') < 'c'
    glasswm
        8
    glasswm  
    OP
       2020-03-07 11:05:19 +08:00
    还是各位熟悉的姿势多。

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

    可以参看这个

    ========


    另外,从类型角度来说,

    >>> isinstance(True, int)
    True

    所以假如你比较

    >>> 1 < True
    False

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

    内容看清楚没
    Tomotoes
        11
    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
        12
    glasswm  
    OP
       2020-03-07 12:22:12 +08:00 via Android
    @freakxx 这个 repo 有意思。
    deplives
        13
    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
        14
    Buges  
       2020-03-07 12:36:25 +08:00 via Android
    这语法糖有意思,Python 果然优雅
    loading
        15
    loading  
       2020-03-07 12:37:22 +08:00 via Android
    语法糖,先还原语法糖。
    str 比较,ascii,得到两个 bool 类型,都是 true
    最后两个 true,得出 true。
    loading
        16
    loading  
       2020-03-07 12:38:45 +08:00 via Android
    如果加括号,就会变成一个 bool <'str'
    两边的类型不同了。

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

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

    2.7 中
    0.5<0.8<0.9 -> True
    (0.5<0.8)<0.9 -> False
    tairan2006
        30
    tairan2006  
       2020-03-08 09:34:16 +08:00 via Android
    这不是 py2 就有的语法糖么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:18 · PVG 02:18 · LAX 10:18 · JFK 13:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.