V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
John60676
V2EX  ›  程序员

Python 里面 False == None 为什么是 False 而不是 True

  •  
  •   John60676 · 2018-05-03 18:15:22 +08:00 · 5142 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有人能解答一下

    第 1 条附言  ·  2018-05-04 09:46:22 +08:00
    感谢楼下几位同学认真的回复,我自己又查了一下相关资料。感觉下面的文档的解释更加合理

    https://docs.python.org/3.0/whatsnew/3.0.html?highlight=incomparable#ordering-comparisons



    PS(楼下有些人真的很无聊,我拿个我自己不理解的问题上来问问,你觉得弱智,简单大可以无视,为啥还要专门回复一些无关紧要的答案来秀优越呢?)
    31 条回复    2018-05-04 10:51:26 +08:00
    Hopetree
        1
    Hopetree  
       2018-05-03 18:20:36 +08:00   ❤️ 1
    ```
    print(False==None)
    print(False==0)
    print(0==None)
    print(None==None)

    False
    True
    False
    True
    ```
    alvin666
        2
    alvin666  
       2018-05-03 18:22:21 +08:00 via Android   ❤️ 3
    false 是一个布尔型的变量,在内存中有相应的空间且有存储变量内容,none 意思是空,内存中没有存储(但是有相应的空间)
    annielong
        3
    annielong  
       2018-05-03 18:25:17 +08:00
    一个是布尔一个是空,肯定是不一样的,甚至空的字符串和 none 都不是一样的
    SuperMild
        4
    SuperMild  
       2018-05-03 18:39:40 +08:00   ❤️ 1
    尽量避免不同类型之间直接比较,特别是动态类型或弱类型语言,往往出现奇怪现象,与其在这上面浪费脑力(同时也给看代码的人添麻烦),还不如采用最佳实践。
    purebluesong
        5
    purebluesong  
       2018-05-03 18:39:48 +08:00
    楼主之前是写弱类型语言的吧
    lolizeppelin
        6
    lolizeppelin  
       2018-05-03 18:41:25 +08:00 via Android
    flase 是 0
    none 是 null
    clino
        7
    clino  
       2018-05-03 18:42:24 +08:00 via Android
    print(False==bool(None))
    这样就能达到你的目的
    huahuajun9527
        8
    huahuajun9527  
       2018-05-03 18:53:08 +08:00   ❤️ 1
    False == None
    相当于 False.__eq__(None)

    ```
    >>> False.__eq__(None)
    NotImplemented
    >>> r = False.__eq__(None)
    >>> type(r)
    <class 'NotImplementedType'>
    ```
    而 NotImplemented 则参考下面链接的文章

    参考:
    https://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in-what-order  

    https://stackoverflow.com/questions/878943/why-return-notimplemented-instead-of-raising-notimplementederror
    enenaaa
        9
    enenaaa  
       2018-05-03 19:10:18 +08:00
    python 虽然是脚本,但是强类型语言
    CSM
        10
    CSM  
       2018-05-03 20:13:39 +08:00 via Android
    因为他们类型不同,不相等很合理。
    我甚至觉得应该直接 raise 一个 TypeError 才合理
    vipfts
        11
    vipfts  
       2018-05-03 20:26:46 +08:00
    print(type(False))
    print(type(None))
    >>>>>>>>>>>>
    <class 'bool'>
    <class 'NoneType'>
    SimbaPeng
        12
    SimbaPeng  
       2018-05-03 21:01:00 +08:00 via Android   ❤️ 1
    Python 不同数据类型之间比较永远不相等,文档里都有写的
    SimbaPeng
        13
    SimbaPeng  
       2018-05-03 21:02:38 +08:00 via Android
    出了 number 这个大类下面的数据类型之间比较会进行数学上的比较之外
    SimbaPeng
        14
    SimbaPeng  
       2018-05-03 21:02:50 +08:00 via Android
    @SimbaPeng 除了
    SimbaPeng
        15
    SimbaPeng  
       2018-05-03 21:06:15 +08:00 via Android
    另外判断是否为 False 或 None 的时候请用 is
    whx20202
        16
    whx20202  
       2018-05-03 21:08:51 +08:00
    java 里面 false 和 null 也不一样啊 ,虽然基本类型没法直接比
    secondwtq
        17
    secondwtq  
       2018-05-03 21:22:37 +08:00
    吃着屎说 真香
    lmqdlr
        18
    lmqdlr  
       2018-05-03 22:03:35 +08:00 via Android
    Python 是动态类型的强类型啊,跟 js 那种坑货不一样
    ltoddy
        19
    ltoddy  
       2018-05-03 22:23:53 +08:00
    == 比较的时候,先调用__eq__()方法,然后如果没有的话,会再调用__hash__()方法,所以才会看到 False==0 返回 True 的结果。
    Arnie97
        20
    Arnie97  
       2018-05-04 01:23:04 +08:00 via Android
    建议用 is 和 is not 来和 None 比较
    binux
        21
    binux  
       2018-05-04 01:36:32 +08:00
    就是这么规定的,这么吧。
    markx
        22
    markx  
       2018-05-04 02:52:35 +08:00
    因为是强类型语言。
    mingyun
        23
    mingyun  
       2018-05-04 06:50:47 +08:00   ❤️ 1
    日了狗了

    >>> a='wtf'
    >>> b='wtf'
    >>> a is b
    True
    >>> c='wtf!'
    >>> d='wtf!'
    >>> c is d
    False
    xuc
        24
    xuc  
       2018-05-04 08:02:23 +08:00   ❤️ 1
    @mingyun id(a) id(b) id(c) id(d) 看一下就明白了,intern 机制
    jy02201949
        25
    jy02201949  
       2018-05-04 09:02:23 +08:00
    我不明白你们一整天用关公战秦琼有什么实战的意义
    John60676
        26
    John60676  
    OP
       2018-05-04 09:55:15 +08:00
    @ltoddy bool 的父类是 int,且 True 的值为 1,False 的值为 0 吧,所以 False == 0 是 True
    jasonyang9
        27
    jasonyang9  
       2018-05-04 10:20:41 +08:00
    一个小坑而已,多踩踩就好了
    SuT2i
        28
    SuT2i  
       2018-05-04 10:47:28 +08:00
    @xuc
    @mingyun 谢谢老铁 学习了
    aaronzjw
        29
    aaronzjw  
       2018-05-04 10:50:03 +08:00
    pyhton 的小坑
    if i and i < 0:
    do something
    ycz0926
        30
    ycz0926  
       2018-05-04 10:51:21 +08:00
    类型不同,怎么比较呢?
    (。。其实觉得 python 这点有点丑陋)
    aaronzjw
        31
    aaronzjw  
       2018-05-04 10:51:26 +08:00
    发错了,抱歉。有时候想要判断变量是否为 none 和变量为 0,这样会坑。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:19 · PVG 14:19 · LAX 22:19 · JFK 01:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.