" foo is None"和" foo == None"之间有什么区别吗?

时间:2020-03-05 18:42:56  来源:igfitidea点击:

之间有什么区别:

if foo is None: pass

if foo == None: pass

我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但是最近我遇到了使用后者的代码。 None是NoneType的一个实例(也是唯一的实例,IIRC),所以没关系,对吗?在任何情况下都有可能吗?

解决方案

回答

如果" is"比较相同的对象实例,则始终返回" True"。

==最终由__eq __()方法确定

IE。

>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

回答

我们可能需要阅读此对象的标识和等效信息。

语句" is"用于对象标识,它检查对象是否引用相同的实例(内存中的相同地址)。

并且'=='语句引用相等(相同值)。

回答

对于"无",相等(==)和同一性(is)之间不应有区别。 NoneType可能返回相等性的标识。由于None是唯一可以使用NoneType的实例(我认为这是对的),因此两个操作是相同的。对于其他类型,情况并非总是如此。例如:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

这将打印"等于",因为列表具有比较操作,而不是默认返回标识。

回答

@杰森:

I recommend using something more along the lines of

if foo:
    #foo isn't None
else:
    #foo is None

我不喜欢使用" if foo:",除非foo真正代表一个布尔值(即0或者1)。如果foo是字符串或者对象或者其他对象,则" if foo:"可能有效,但对我来说似乎是个懒惰的快捷方式。如果要检查x是否为None,请说"如果x为None:"。

回答

请注意:

if foo:
  # do something

与以下内容不完全相同:

if x is not None:
  # do something

前者是布尔值测试,可以在不同的上下文中评估为false。在布尔值测试中,有很多东西代表假,例如空容器,布尔值。在这种情况下,没有人会得出错误的结论,但其他事情也会发生。

回答

(ob1 is ob2)等于(id(ob1)== id(ob2))

回答

首选方法foo是None的原因是,我们可能正在处理一个定义了自己的__eq__的对象,并且该对象将其定义为等于None。因此,如果需要查看它是否实际上是"无",请始终使用" foo为None"。