Python 里面 False == None 为什么是 False 而不是 True - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
John60676
V2EX    程序员

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

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

    有没有人能解答一下

    第 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     Solana     929 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 22:44 PVG 06:44 LAX 14:44 JFK 17:44
    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