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

231 投票
12 回答
34885 浏览
提问于 2025-04-11 09:15

这段话在问:

if foo is None: pass

if foo == None: pass

这两者之间有没有什么区别?

我看到的大部分Python代码(还有我自己写的代码)都用的是前者,但我最近遇到了一些代码用的是后者。None是NoneType的一个实例(如果我没记错的话,是唯一的一个),所以这应该没什么关系,对吧?有没有什么情况下会有区别呢?

12 个回答

28

提醒一下:

if foo:
    # do something

并不完全等同于:

if foo is not None:
    # do something

前者是一个布尔值的测试,可以在不同的情况下评估为假。布尔值测试中有很多东西可以表示假,比如空的容器和布尔值本身。在这种情况下,None也会被评估为假,但还有其他东西也是如此。

51

你可能想看看这个:对象的身份和等价性

在这里,is 用来判断对象的身份,它检查两个对象是否指向同一个实例(也就是在内存中是否是同一个地址)。

== 则是用来判断两个对象的值是否相等。

274

is 总是会返回 True,如果它比较的是同一个对象实例。而 == 的结果则是由 __eq__() 方法来决定的。

也就是说:

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

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

撰写回答