这两者之间有什么区别吗:
if foo is None: pass
and
if foo == None: pass
我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但我最近遇到了使用后者的代码。None是NoneType的一个实例(也是唯一的实例,IIRC),所以它不应该有关系,对吗?有没有可能的情况?
这两者之间有什么区别吗:
if foo is None: pass
and
if foo == None: pass
我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但我最近遇到了使用后者的代码。None是NoneType的一个实例(也是唯一的实例,IIRC),所以它不应该有关系,对吗?有没有可能的情况?
当前回答
对于None,相等(==)和恒等式(is)之间不应该有区别。NoneType可能返回相等的标识。因为None是唯一可以使用NoneType的实例(我认为这是正确的),所以这两个操作是相同的。在其他类型的情况下,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
这将打印“Equal”,因为列表有一个比较操作,而不是默认返回的identity。
其他回答
is总是返回True如果它比较相同的对象实例
而==最终由__eq__()方法确定
i.e.
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
对于None,相等(==)和恒等式(is)之间不应该有区别。NoneType可能返回相等的标识。因为None是唯一可以使用NoneType的实例(我认为这是正确的),所以这两个操作是相同的。在其他类型的情况下,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
这将打印“Equal”,因为列表有一个比较操作,而不是默认返回的identity。
是测试身份而不是平等对于foo语句为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 = None总是为真。
In [101]: None is None
Out[101]: True
foo为None的原因是首选的方式,因为你可能正在处理一个对象,该对象定义了自己的__eq__,并将该对象定义为None。所以,如果你需要查看它是否为None,总是使用foo is None。
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