这两者之间有什么区别吗:
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),所以它不应该有关系,对吗?有没有可能的情况?
当前回答
foo为None的原因是首选的方式,因为你可能正在处理一个对象,该对象定义了自己的__eq__,并将该对象定义为None。所以,如果你需要查看它是否为None,总是使用foo is None。
其他回答
foo为None的原因是首选的方式,因为你可能正在处理一个对象,该对象定义了自己的__eq__,并将该对象定义为None。所以,如果你需要查看它是否为None,总是使用foo is None。
没有区别,因为相同的对象当然是相等的。然而,PEP 8明确指出您应该使用的是:
与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。
更多细节:
is子句实际上检查两个对象是否相同 内存位置与否。也就是它们是否都指向同一个点 内存位置和具有相同的id。 作为1的结果,is确保两个用词法表示的对象是否具有相同的属性(属性的属性…) 原始类型的实例化,如bool, int, string(有一些例外),具有相同值的NoneType将始终位于相同的内存位置。
E.g.
>>> 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的“查找”表中只能有一个自身的实例,因此前者和后者更多的是编写代码的开发人员的编程风格(可能是为了一致性),而不是有任何微妙的逻辑原因来选择一个而不是另一个。
(ob1 = ob2) = (id(ob1) == id(ob2))
@Jason:
我建议使用类似于 如果foo: #foo不是None 其他: #foo为None
我不喜欢使用“if foo:”,除非foo真正代表一个布尔值(即0或1)。如果foo是一个字符串或对象或其他东西,“if foo:”可能工作,但它看起来像一个懒惰的快捷方式给我。如果你要检查x是否为None,请输入“If x is None:”。