这两者之间有什么区别吗:
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),所以它不应该有关系,对吗?有没有可能的情况?
当前回答
John Machin的结论是None是单例,这段代码支持了这个结论。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
因为None是一个单例,x == None和x is None会有相同的结果。然而,在我的审美观点,x == None是最好的。
其他回答
foo为None的原因是首选的方式,因为你可能正在处理一个对象,该对象定义了自己的__eq__,并将该对象定义为None。所以,如果你需要查看它是否为None,总是使用foo is None。
John Machin的结论是None是单例,这段代码支持了这个结论。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
因为None是一个单例,x == None和x is None会有相同的结果。然而,在我的审美观点,x == None是最好的。
没有区别,因为相同的对象当然是相等的。然而,PEP 8明确指出您应该使用的是:
与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。
(ob1 = ob2) = (id(ob1) == id(ob2))
提醒一句:
if foo:
# do something
并不完全等同于:
if x is not None:
# do something
前者是一个布尔值测试,可以在不同的上下文中计算为false。在布尔值测试中有很多东西表示为假例如空容器,布尔值。在这种情况下,None的值也为false,但其他东西也是如此。