问题:“ foo is None”和“ foo == None”之间有什么区别吗?
之间有什么区别:
if foo is None: pass
和
if foo == None: pass
我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但是最近我遇到了使用后者的代码。None是NoneType的一个实例(也是唯一的实例,IIRC),所以没关系,对吗?在任何情况下都有可能吗?
回答 0
is
True
如果比较相同的对象实例,则始终返回
而==
最终由该__eq__()
方法确定
即
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
回答 1
回答 2
请注意:
if foo:
# do something
与以下内容不完全相同:
if x is not None:
# do something
前者是布尔值测试,可以在不同的上下文中评估为false。在布尔值测试中,有很多东西代表假,例如空容器,布尔值。在这种情况下,没有人会得出错误的结论,但是其他事情也会发生。
回答 3
(ob1 is ob2)
等于 (id(ob1) == id(ob2))
回答 4
原因foo is None
是首选的方式是您可能正在处理一个定义了自己__eq__
的对象,并且该对象定义为等于None。因此,foo is None
如果需要查看它是否确实存在,请始终使用None
。
回答 5
没有区别是因为相同的对象当然是相等的。但是,PEP 8明确指出您应该使用is
:
与单例(如None)的比较应该始终使用is或not(而不是equals运算符)进行。
回答 6
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
对于“无”,相等(==)和身份(is)之间不应有区别。NoneType可能返回相等性的标识。由于None是唯一可以使用NoneType的实例(我认为这是对的),因此两个操作是相同的。对于其他类型,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
这将打印“等于”,因为列表具有比较操作,而不是默认返回标识。
回答 8
@ 杰森:
我建议按照以下方式使用更多内容
if foo: #foo isn't None else: #foo is None
我不喜欢使用“ if foo:”,除非foo真正表示一个布尔值(即0或1)。如果foo是字符串或对象或其他对象,则“ if foo:”可能有效,但对我来说似乎是一个懒惰的快捷方式。如果要检查x是否为None,请说“如果x为None:”。
回答 9
一些更多的细节:
该
is
子句实际上检查两个object
s是否在相同的内存位置。即它们是否都指向相同的内存位置并具有相同的id
。作为1的结果,请
is
确保两个词法表示的object
s是否具有相同的属性(attributes-of-attributes …)原始类型等的实例
bool
,int
,string
(有一些exceptions),NoneType
具有相同的值将总是在相同的存储位置。
例如
>>> 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
约翰·马钦(John Machin)得出的结论None
是单例,这一结论得到了该代码的支持。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
由于None
是单身,x == None
并且x is None
将有同样的结果。但是,从我的美学观点来看,x == None
是最好的。
回答 11
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