布尔标识== True vs为True

 妖精的尾巴的阿鲁哈 发布于 2022-12-07 19:56

使用if foo is None而不是if foo == None测试值是否具体是标准惯例None.

如果你想确定一个值是否正确True(不仅仅是一个真实的值),是否有任何理由使用if foo == True而不是if foo is True?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?

示例:say True用作要与值'bar'或任何其他类似真值的值区分开的单例值:

if foo is True: # vs foo == True
    ...
elif foo == 'bar':
    ...

是否存在使用if foo is True会产生不同结果的情况if foo == True

注意:我知道Python布尔值 - 如果x:,则vs x == True,vs如果x为True.但是,它仅解决是否if foo,if foo == Trueif foo is True通常应用于确定是否foo具有真实值.


更新:根据PEP285§规范:

值False和True将是单例,如None.

Ferdinand Be.. 42

如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),是否有任何理由使用if foo == True而不是foo为True?

如果要确保它foo确实是布尔值和值True,请使用is运算符.

否则,如果foo自己的实现类型__eq__()在比较时返回true-ish值True,则可能最终会出现意外结果.

根据经验,您应该始终使用is内置常量True,FalseNone.

这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?

从理论上讲,is将比==后者必须尊重类型的自定义__eq__实现更快,同时is可以直接比较对象标识(例如,内存地址).

我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来存在魔法方法来优化它,所以我怀疑你不会注意到速度差异在实践中.

3 个回答
  • 是否有任何理由使用if foo == True而不是foo为True?"

    >>> d = True
    >>> d is True
    True
    >>> d = 1
    >>> d is True
    False
    >>> d == True
    True
    >>> d = 2
    >>> d == True
    False
    

    注意,它boolint,并且True具有整数值的子类1.要回答您的问题,如果要检查某个变量"是否为True",则必须使用identity运算符is.但这真的不是pythonic ......我想问你的真实用例是什么 - IOW:你为什么要在它们之间做出改变True,1或者是什么'真值'?

    2022-12-11 02:07 回答
  • 如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),是否有任何理由使用if foo == True而不是foo为True?

    如果要确保它foo确实是布尔值和值True,请使用is运算符.

    否则,如果foo自己的实现类型__eq__()在比较时返回true-ish值True,则可能最终会出现意外结果.

    根据经验,您应该始终使用is内置常量True,FalseNone.

    这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?

    从理论上讲,is将比==后者必须尊重类型的自定义__eq__实现更快,同时is可以直接比较对象标识(例如,内存地址).

    我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来存在魔法方法来优化它,所以我怀疑你不会注意到速度差异在实践中.

    2022-12-11 02:12 回答
  • 切勿is True与numpy(以及熊猫等衍生物)结合使用:

    In[1]: import numpy as np
    In[2]: a = np.array([1, 2]).any()
    In[4]: a is True
    Out[4]: False
    In[5]: a == True
    Out[5]: True
    

    这对我来说意外:

    In[3]: a
    Out[3]: True
    

    我想解释是由:

    In[6]: type(a)
    Out[6]: numpy.bool_
    

    2022-12-11 02:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有