之间有什么区别:
if foo is None: pass
和
if foo == None: pass
我在大多数Python代码中看到的约定(以及我自己编写的代码)都是前者,但我最近遇到了使用后者的代码。 None是NoneType的实例(也是唯一的实例,IIRC),所以没关系,对吧?它有什么可能的情况吗?
答案 0 :(得分:249)
is
如果比较同一个对象实例
True
==
最终由__eq__()
方法确定
即
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
答案 1 :(得分:48)
答案 2 :(得分:24)
提醒:
if foo:
# do something
不与:
完全相同if x is not None:
# do something
前者是一个布尔值测试,可以在不同的上下文中评估为false。在布尔值测试中有许多表示false的东西,例如空容器,布尔值。在这种情况下,None也评估为false,但其他事情也是如此。
答案 3 :(得分:12)
(ob1 is ob2)
等于(id(ob1) == id(ob2))
答案 4 :(得分:12)
foo is None
是首选方法的原因是您可能正在处理定义其自己的__eq__
的对象,并将该对象定义为等于None。因此,如果您需要查看它是否为foo is None
,请始终使用None
。
答案 5 :(得分:8)
没有区别,因为相同的物体当然是相同的。但是,PEP 8明确指出您应该使用is
:
比较像单一的单身人士应该总是使用is或者不是,而不是相等的运算符。
答案 6 :(得分:7)
is
测试身份,不平等。对于语句foo is none
,Python只是比较对象的内存地址。这意味着你问的问题是"我对同一个对象有两个名字吗?"
==
测试由__eq__()
方法确定的相等性。它并不关心身份。
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
None
是一个单身操作员。所以None is None
总是如此。
In [101]: None is None
Out[101]: True
答案 7 :(得分:4)
对于None,等于(==)和identity(是)之间不应该有区别。 NoneType可能返回相等的标识。由于None是唯一可以使用NoneType的实例(我认为这是真的),因此两个操作是相同的。在其他类型的情况下,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
这将打印“Equal”,因为列表的比较操作不是默认的身份返回。
答案 8 :(得分:4)
@ Jason:
我建议使用更多内容
if foo: #foo isn't None else: #foo is None
我不喜欢使用“if foo:”,除非foo真正表示一个布尔值(即0或1)。如果foo是一个字符串或一个对象或其他东西,“if foo:”可能会起作用,但它看起来像是一个懒惰的快捷方式。如果您要检查x是否为None,请说“if x is None:”。
答案 9 :(得分:2)
更多细节:
is
子句实际检查两个object
是否相同
内存位置与否。即他们是否都指向相同的
内存位置并具有相同的id
。
作为1的结果,is
确保两个词汇表示的object
是否具有相同的属性(属性属性......)1} p>
bool
,int
,string
等原始类型的实例化(有一些例外),具有相同值的NoneType
将始终位于同一内存中位置。
E.g。
>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True
由于NoneType
在python的“查找”表中只能有一个自身实例,因此前者和后者更多地是编写代码的开发人员的编程风格(可能是为了一致性)而不是有任何微妙的逻辑理由来选择一个而不是另一个。
答案 10 :(得分:1)
John Machin的结论None
是一个单身人士,这个结论得到了这个代码的支持。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
由于None
是单身,x == None
和x is None
会有相同的结果。但是,在我的审美观点中,x == None
是最好的。
答案 11 :(得分:0)
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence
a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True