标准惯例是使用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 foo
,if foo == True
或if foo is True
通常应用于确定foo
是否具有真实值。
更新:根据PEP 285§规范:
值False和True将是单例,如None。
答案 0 :(得分:32)
如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),如果foo == True而不是foo为True,是否有任何理由使用?
如果您想确保foo
确实是布尔值且值为True
,请使用is
运算符。
否则,如果foo
的类型实现了自己的__eq__()
,在与True
进行比较时会返回true-ish值,则可能会出现意外结果。
根据经验,您应始终将is
与内置常量True
,False
和None
一起使用。
这在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
请注意,bool
是int
的子类,True
的整数值为1
。要回答您的问题,如果要检查某个变量“是否为True”,则必须使用标识运算符is
。 但是这真的不是pythonic ......请问你的真实用例是什么 - IOW:你为什么要在True
,1
或任何'真相之间做出改变? '价值?
答案 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
查看此帖子,了解评估为False
:Evaluation 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
是否真的是一个布尔值。
True
与其他真值不同的函数是违反直觉的)立>
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()