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
ihaveadrame
V2EX  ›  Python

[ Python ] 1 != 0 > 0 为什么会是 false?

  •  
  •   ihaveadrame · 2018-05-28 10:49:25 +08:00 · 5240 次点击
    这是一个创建于 2131 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,前两天有人问我这个题没答对。尴尬,查漏补缺吧。希望看到的大牛帮忙解惑~谷歌失败后,一脸正经的发帖。
    35 条回复    2018-05-29 09:39:09 +08:00
    pabupa
        1
    pabupa  
       2018-05-28 10:53:18 +08:00
    >
    (1 != 0) > 0
    1 != (0 > 0)
    pabupa
        2
    pabupa  
       2018-05-28 10:54:40 +08:00
    `(1 != 0) > 0 ` `1 != (0 > 0)`
    pabupa
        3
    pabupa  
       2018-05-28 10:55:04 +08:00
    嘿~怎么都没格式呀
    lianyue
        4
    lianyue  
       2018-05-28 10:56:11 +08:00
    运算符优先级
    Kiriz
        5
    Kiriz  
       2018-05-28 10:57:08 +08:00 via iPhone
    < <= > >= 优先于 != ==
    littleylv
        6
    littleylv  
       2018-05-28 11:01:41 +08:00
    >>> print 1 != (0 > 0)
    True
    >>> print (1 != 0) > 0
    True
    >>> print 1 != 0 > 0
    False
    ihaveadrame
        7
    ihaveadrame  
    OP
       2018-05-28 11:05:23 +08:00
    @pabupa 那按照你说的 结果不应该是 true 吗?
    @lianyue @Kiriz 你用你理解的优先级 告诉我你的答案
    @littleylv 这个运行的结果,所以才有了这个主题
    chengluyu
        8
    chengluyu  
       2018-05-28 11:06:41 +08:00   ❤️ 9
    搜的姿势不对,搜「 python chained comparision 」就可以搜到结果了:

    > Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).

    摘自 https://docs.python.org/3/reference/expressions.html 的 6.10 Comparisions。
    menc
        9
    menc  
       2018-05-28 11:07:47 +08:00   ❤️ 1
    看这个

    ihaveadrame
        10
    ihaveadrame  
    OP
       2018-05-28 11:07:55 +08:00
    @chengluyu 感谢~ (づ ̄ 3  ̄)づ
    ihaveadrame
        11
    ihaveadrame  
    OP
       2018-05-28 11:10:37 +08:00
    @menc 涨姿势~
    jmc891205
        12
    jmc891205  
       2018-05-28 11:10:50 +08:00
    这个应该等价于 1!=0 and 0>0
    VYSE
        13
    VYSE  
       2018-05-28 11:11:15 +08:00
    这跟运算优先级没关系, PY 这点比较 tricky, 转换后实际是 1 != 0 and 0 > 0, 加括号后才当算数运算.
    https://stackoverflow.com/questions/18528431/what-is-the-meaning-of-true-true-false-in-python-and-how-to-find-out
    whoami9894
        14
    whoami9894  
       2018-05-28 11:11:21 +08:00 via Android
    1 != 0 > 0
    <=>
    1 != 0 && 0 > 0
    littleylv
        15
    littleylv  
       2018-05-28 11:11:52 +08:00
    @ihaveadrame #7 我那个是反驳 4 楼 5 楼的,没经实践就瞎说


    @chengluyu #8 天呐还有这种特性?所以是:
    >>> print 1 != 0 > 0
    False
    >>> print (1 != 0) and (0 > 0)
    False
    跪了
    chengluyu
        16
    chengluyu  
       2018-05-28 11:16:13 +08:00
    @littleylv 所以就可以写连等 a < b < c < d < e < f 了。
    xxxy
        17
    xxxy  
       2018-05-28 11:18:42 +08:00
    https://docs.python.org/2/reference/expressions.html#comparisons

    总结一下,就是链式比较的时候从左到右,一旦有一个为 false 就返回 false,剩下的不再执行
    ihaveadrame
        18
    ihaveadrame  
    OP
       2018-05-28 11:20:00 +08:00
    @all 这里我根据 @chengluyu 提供的信息 “ x<y<=z 当 优先级高的运算出现了 false,比较就会终止返回 false ” 。结合本题 1 != 0 > 0 这里 > 运算符优先级最高,因此 顺序排列后是 0 > 0 != 1 因为第一次比较就出现了 false,所以直接返回 false。
    SuT2i
        19
    SuT2i  
       2018-05-28 11:23:58 +08:00
    1 != 0 > 0 等价于 1!=0 and 0>0
    yazoox
        20
    yazoox  
       2018-05-28 11:34:13 +08:00
    楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿......
    VYSE
        21
    VYSE  
       2018-05-28 11:39:45 +08:00
    @ihaveadrame #18 再看看 9 楼的 dis 结果? 并没有优先判断>哦, 而是从左到右分解开了一个个判断
    karllynn
        22
    karllynn  
       2018-05-28 11:59:59 +08:00
    链式比较吧,py 的一个特性,写成`10 > a > 11`可能更容易想起来这个玩意儿
    mayne95
        23
    mayne95  
       2018-05-28 12:09:13 +08:00 via Android
    前 6 楼全歪了,什么鬼。V 站不是这个水平吧🤣
    ihaveadrame
        24
    ihaveadrame  
    OP
       2018-05-28 12:23:12 +08:00
    @VYSE 没错 是我理解错了。 学习了下 python 字节码,收货蛮大的。
    ihaveadrame
        25
    ihaveadrame  
    OP
       2018-05-28 12:25:26 +08:00
    @yazoox 怎么说呢 你觉得是就是了~ 虚心接受指教
    Rob007
        26
    Rob007  
       2018-05-28 17:08:19 +08:00
    >>int(1 !=0 ) > 0
    >>True
    ytmsdy
        27
    ytmsdy  
       2018-05-28 17:11:38 +08:00
    “茴” 字有几种写法??
    wfd0807
        28
    wfd0807  
       2018-05-28 17:51:05 +08:00
    py 的链式比较,哈哈,我非 pythoner 都知道。。。
    laoyur
        29
    laoyur  
       2018-05-28 18:31:04 +08:00
    @yazoox
    > 楼主,你是应届生么?还是社招?这个问题,问得实在是有点儿......

    这口气,就你是大牛,问这个问题就是菜逼,对不对?
    copie
        30
    copie  
       2018-05-28 18:53:04 +08:00   ❤️ 1
    In [2]: dis.dis("a!=b>b")
    1 0 LOAD_NAME 0 (a)
    2 LOAD_NAME 1 (b)
    4 DUP_TOP
    6 ROT_THREE
    8 COMPARE_OP 3 (!=)
    10 JUMP_IF_FALSE_OR_POP 18
    12 LOAD_NAME 1 (b)
    14 COMPARE_OP 4 (>)
    16 RETURN_VALUE
    >> 18 ROT_TWO
    20 POP_TOP
    22 RETURN_VALUE

    上面是 Python 运行时的字节码;然后我们来解释一下每一行什么意思
    LOAD_NAME a 可以理解将 a 压入运行时栈 运行第一行后的栈 a,......|
    运行第二行后的栈 b,a,......|
    DUP_TOP 可以理解为把栈顶复制一份重新压入栈 运行第三行后的栈 b,b,a,......|
    ROT_THREE 可以理解为把原来栈顶放到第三个位
    置,把原来二放到第一个位置,把原来第三放到第二位
    置 运行第四行后的栈 b,a,b......|
    COMPARE_OP 这个就是进行 != 运算,将 b 弹出然后
    获取 a 得到比较结果 res 后设置栈顶 运行第五行后的栈 res,b......|
    如果 res 是 false 就跳到 18
    运行第七行后的栈 b(后一个 b), b,......|
    copie
        31
    copie  
       2018-05-28 19:00:10 +08:00   ❤️ 1
    接着 30 楼(不小心点回复了)
    ...................................................................运行第八行后的栈 res,.........
    运行九局行返回结果 res
    然后我们接着看 18
    运行 18 之前的 栈 res,b,........|
    运行 18 之后的 栈 b,res,........|
    运行 20 之后的 栈 res,............|
    然后返回 res

    看完上面的运行步骤我们可以看到.
    如果是一个"a>b>c" 这样的运算 Python 会理解为
    a>b and b>c
    param
        32
    param  
       2018-05-29 00:33:43 +08:00 via Android
    3 < 4 > 1 #True
    ( 3 < 4) > 2 #False
    还有这种事?
    param
        33
    param  
       2018-05-29 00:33:57 +08:00 via Android
    3 < 4 > 1 #True
    ( 3 < 4) > 1 #False
    还有这种事?
    lunafreya
        34
    lunafreya  
       2018-05-29 03:51:23 +08:00 via iPhone
    @chengluyu
    感谢,涨姿势了
    stanfordwang
        35
    stanfordwang  
       2018-05-29 09:39:09 +08:00
    涨知识了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1144 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:33 · PVG 02:33 · LAX 11:33 · JFK 14:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.