这两者之间有什么区别吗:

if foo is None: pass

and

if foo == None: pass

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


当前回答

John Machin的结论是None是单例,这段代码支持了这个结论。

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

因为None是一个单例,x == None和x is None会有相同的结果。然而,在我的审美观点,x == None是最好的。

其他回答

你可能想读这个对象的身份和等价性。

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

而'=='语句指的是相等(相同的值)。

is总是返回True如果它比较相同的对象实例

而==最终由__eq__()方法确定

i.e.


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

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

是测试身份而不是平等对于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

John Machin的结论是None是单例,这段代码支持了这个结论。

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

因为None是一个单例,x == None和x is None会有相同的结果。然而,在我的审美观点,x == None是最好的。

(ob1 = ob2) = (id(ob1) == id(ob2))