当前位置: 首页 > 知识库问答 >
问题:

布尔恒等式==True vs is True

经嘉
2023-03-14

这是标准的惯例,使用如果foo是无而不是如果foo==无来测试一个值是否特别是

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

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

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

如果foo为真,使用是否会产生与foo==真的不同的结果?

注意:我知道Python布尔值-如果x:,vs如果x==True,vs如果x是True。然而,它只解决了是否if fooif foo==True,或if foo is True通常用于确定foo是否具有类似true的值。

更新:根据PEP 285§规范:

值False和True将是单例,如无。


共有3个答案

穆浩皛
2023-03-14

是否有任何理由使用if foo==True而不是if 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。要回答您的问题,如果您想检查某个变量是否“完全正确”,则必须使用标识运算符is。但那真的不是蟒蛇式的。。。我可以问一下你真正的用例是什么吗?IOW:为什么你想在True1或任何“真值”之间做出区别?

解河
2023-03-14

永远不要使用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_
夔波
2023-03-14

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

如果要确保foo确实是一个布尔值且值True,请使用is运算符。

否则,如果foo类型实现了自己的\uuuu eq\uuu(),在与true进行比较时返回一个true ish值,则可能会得到意外的结果。

根据经验,应始终将is与内置常量TrueFalseNone一起使用。

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

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

我不知道各种Python实现的源代码,但我假设它们中的大多数都可以通过使用一些内部标志来优化魔术方法的存在,因此我怀疑您不会注意到实践中的速度差异。

 类似资料:
  • 我有一个api从openweathermap.org请求天气数据 api的回复示例如下: 但当我试图通过上述回复获得天气状况时: 为什么< code > console . log(weather type = = " clouds ");返回false?这个类是正确的,输出也是正确的,但是仍然返回false。更奇怪的是,有时当网络很慢时,它会返回true?会不会是Ajax需要变慢才能被检测到?。

  • 问题内容: 使用不等号运算符,我必须定义一个过程,该过程将字符串作为输入,如果为“ Saturday”或“ Sunday”,则返回布尔值。 这是我的代码 这似乎每天都在发生,我不知道为什么,从逻辑上讲它会起作用…有人可以解释吗? 问题答案: 固定版本: 更好的版本: 为什么不起作用: 当您使用时,您的状况将显示为“如果今天不是星期六,或者今天不是星期日”。现在,将“今天”替换为“星期六”: 如果星

  • 我用以下方式解决了一个问题: 它起作用了。问题是所有这些if语句都让我厌烦,我也无法想象它们是世界上最快的东西。我想这样解决它: 问题是bool8是一个保留类型,而不是一个真正的类型,所以方法1已经过时了。然而,方法2不能正确工作。我怀疑原因与它的第一行有关。这 我的问题是,是否有任何方法可以以更干净、更并行的方式重写原始代码? 谢谢,

  • 我开始学习布尔表达式。我正试图找出以下问题: 假设age1、age2和age3是int变量,假设答案是布尔变量。编写一个表达式,当age1小于或等于age2并且age2小于或等于age3时,该表达式将答案指定为true。否则答案应为false。 我已经尝试了一些东西,但对Java来说还是比较陌生的。我能把答案打印出来,但我的数字还是有问题。 这是错误的: 我只是不知道如何解决这个问题,或者代码中到

  • 我有两个实体:类别和具有一对多关系的产品。 如果价格大于100,我如何按产品数量订购类别?类似(这不起作用):

  • 问题内容: 所以我有一个关于考试作业的问题,在这个作业中,我们有一堆布尔表达式,例如: 然后,我们应该编写布尔表达式的值。为此,我使用了三值逻辑,但是当您获得如下所示的布尔表达式时,这将如何应用: 或者 通过三值逻辑可以很容易地找到第一个,但是我如何找出另外两个。 我知道这是一个非常基本的问题,但是我对此仍然是陌生的。 提前致谢 问题答案: 您需要布尔值和的三相真值表: 该表是缩写,依赖于布尔逻辑