标准惯例是使用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。
如果要确定某个值是否完全为True(而不仅仅是类似True的值,是否有任何理由要使用foo == True而不是foo为True?
如果要确保foo
确实是布尔值且值为True
,请使用is
运算符。
否则,如果foo
的类型实现了自己的__eq__()
,与True
相比返回了真值,则可能会导致意外结果。
根据经验,应该始终将is
与内置常量True
,False
和None
一起使用。
这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
理论上,is
将比==
快,因为后者必须遵守类型的自定义__eq__
实现,而is
可以直接比较对象标识(例如,内存地址)。
我本质上不知道各种Python实现的源代码,但我认为其中大多数可以通过使用一些内部标志来优化魔术方法的存在,因此我怀疑您不会注意到实际速度差异。
请勿将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_
如果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
或任何“真值”之间进行区分?
大多数时候,您不应该关心这样的细节。您可能已经知道foo
是布尔值(因此可以使用if foo
),或者您已经知道foo
是其他值(在这种情况下无需测试)。如果您不知道变量的类型,则可能需要重构代码。
但是如果您确实需要确定它确实是True
,而没有别的,请使用is
。使用==
将给您1 == True
。
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
[查看此帖子以评估False
:Evaluation of boolean expressions in Python
这里有一个测试,可让您查看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
正如您所看到的,在某些情况下,它们都会产生不同的结果。