布尔标识== True vs为True

时间:2014-12-03 16:19:43

标签: python boolean jython cpython pypy

标准惯例是使用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 Trueif 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。

7 个答案:

答案 0 :(得分:32)

  

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

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

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

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

  

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

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

我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来优化魔术方法的存在,所以我怀疑你赢了# 39;注意练习中的速度差异。

答案 1 :(得分:18)

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

答案 2 :(得分:10)

  

是否有任何理由使用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”,则必须使用标识运算符is但是这真的不是pythonic ......请问你的真实用例是什么 - IOW:你为什么要在True1或任何'真相之间做出改变? '价值?

答案 3 :(得分:1)

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

但如果您确实需要确定它完全是True而没有其他内容,请使用is。使用==会为您提供1 == True

答案 4 :(得分:0)

编辑:重新is True==

有一个案例,就是这样:

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

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

另外,对于作为哨兵值的单身人士,你可以只使用一个班级

class SentinelTime(object): pass

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

您不想使用if var == True:,您真的想要if var:

想象你有一个清单。如果列表是" True"你不在乎。或不,你只想知道它是否为空。所以...

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

查看此帖子,了解评估为FalseEvaluation of boolean expressions in Python

的内容

答案 5 :(得分:0)

这是一个测试,可以让你看到3种测试形式之间的差异:

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

正如您所看到的,有些情况下所有这些都会产生不同的结果。

答案 6 :(得分:0)

如果大多数时候不是您想要的,请使用 foo is True 而不是 foo == True(或仅使用 foo)。

我已经看到 foo is True 用于检查参数 foo 是否真的是一个布尔值。

  1. 它与 Python 的鸭子类型哲学相矛盾(您通常不应该检查类型。对于假定为鸭子类型的程序员来说,使用 True 与其他真值不同的函数是违反直觉的)
  2. 即使您想检查类型,也最好像这样明确地进行:
def myFunction(foo):
    if not isinstance(foo, bool):
        raise ValueError("foo should be a boolean")
>>> myFunction(1)
Exception: ValueError "foo should be a boolean"

然后如果程序员不知道你的函数不接受真值,或者如果他们使用 numpy 并且忘记将他们的 numpy-boolean 转换为 python-boolean,他们就会知道他们做了什么错误,将能够调试。

比较

def myFunction(foo):
    if foo is True:
       doSomething()
    else:
       doSomethingElse()

在这种情况下,myFunction(1) 不仅不会引发异常,而且可能会做与预期相反的事情。例如,如果有人使用 numpy 布尔值,这将导致很难找到错误。

什么时候应该使用is True

基本上,仅将其用作 isinstance(foo, bool) and foo 的简写

我看到的唯一情况是,当您明确想要检查一个值是否为真时,稍后您还将检查该值是否为另一个真值。示例包括:

if foo is True:
   doSomething()
elif foo is False:
   doSomethingElse()
elif foo is 1:
   doYetSomethingElse()
else:
   doSomethingElseEntirely()