使用if foo is None
而不是if foo == None
测试值是否具体是标准惯例None
.
如果你想确定一个值是否正确True
(不仅仅是一个真实的值),是否有任何理由使用if foo == True
而不是if foo is True
?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
示例:say True
用作要与值'bar'
或任何其他类似真值的值区分开的单例值:
if foo is True: # vs foo == True ... elif foo == 'bar': ...
是否存在使用if foo is True
会产生不同结果的情况if foo == True
?
注意:我知道Python布尔值 - 如果x:,则vs x == True,vs如果x为True.但是,它仅解决是否if foo
,if foo == True
或if foo is True
通常应用于确定是否foo
具有真实值.
更新:根据PEP285§规范:
值False和True将是单例,如None.
Ferdinand Be.. 42
如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),是否有任何理由使用if foo == True而不是foo为True?
如果要确保它foo
确实是布尔值和值True
,请使用is
运算符.
否则,如果foo
自己的实现类型__eq__()
在比较时返回true-ish值True
,则可能最终会出现意外结果.
根据经验,您应该始终使用is
内置常量True
,False
和None
.
这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
从理论上讲,is
将比==
后者必须尊重类型的自定义__eq__
实现更快,同时is
可以直接比较对象标识(例如,内存地址).
我不知道各种Python实现的源代码,但我认为大多数可以通过使用一些内部标志来存在魔法方法来优化它,所以我怀疑你不会注意到速度差异在实践中.
是否有任何理由使用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",则必须使用identity运算符is
.但这真的不是pythonic ......我想问你的真实用例是什么 - IOW:你为什么要在它们之间做出改变True
,1
或者是什么'真值'?
如果你想确定一个值是否完全为True(而不仅仅是一个类似于true的值),是否有任何理由使用if foo == True而不是foo为True?
如果要确保它foo
确实是布尔值和值True
,请使用is
运算符.
否则,如果foo
自己的实现类型__eq__()
在比较时返回true-ish值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_