布尔身份==真vs是真

问题描述 投票:52回答:6

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

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

示例:说True用作要与值'bar'或任何其他真值相区别的单例值:

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

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

注意:我知道Python booleans - if x:, vs if x == True, vs if x is True。但是,它仅解决一般应使用if fooif foo == Trueif foo is True来确定foo是否具有真值。


更新:根据PEP 285§规范:

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

python boolean jython cpython pypy
6个回答
43
投票

如果要确定某个值是否完全为True(而不仅仅是类似True的值,是否有任何理由要使用foo == True而不是foo为True?

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

否则,如果foo的类型实现了自己的__eq__(),与True相比返回了真值,则可能会导致意外结果。

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

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

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

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


20
投票

请勿将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_

13
投票

如果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”,则必须使用身份运算符is但是确实不是pythonic ...请问您真正的用例是什么-IOW:为什么要在True1或任何“真值”之间进行区分?


1
投票

大多数时候,您不应该关心这样的细节。您可能已经知道foo是布尔值(因此可以使用if foo),或者您已经知道foo是其他值(在这种情况下无需测试)。如果您不知道变量的类型,则可能需要重构代码。

但是如果您确实需要确定它确实是True,而没有别的,请使用is。使用==将给您1 == True


1
投票

edit:重新is True==

有一个案例,就是这样:

In [24]: 1 is True
Out[24]: False

In [25]: 1 == True
Out[25]: True

此外,对于单身人士作为前哨值,您可以只创建一个对象:

sentinel_time = object()

def f(snth):
    if snth is sentinel_time:
        print 'got em!'
f(sentinel_time)

您不想使用if var == True:,您确实想要if var:

想象您有一个列表。您不在乎列表是否为“ True”,您只想知道列表是否为空。所以...

l = ['snth']
if l:
    print l

[查看此帖子以评估FalseEvaluation of boolean expressions in Python


0
投票

这里有一个测试,可让您查看True的三种测试形式之间的差异:

for test in ([], [1], 0, 1, 2):
    print repr(test), 'T' if test else 'F', 'T' if test == True else 'F', 'T' if test is True else 'F'

[] F F F
[1] T F F
0 F F F
1 T T F
2 T F F

正如您所看到的,在某些情况下,它们都会产生不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.