这两者之间有什么区别吗:
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),所以它不应该有关系,对吗?有没有可能的情况?
当前回答
你可能想读这个对象的身份和等价性。
语句'is'用于对象标识,它检查对象是否引用同一个实例(内存中相同的地址)。
而'=='语句指的是相等(相同的值)。
其他回答
is总是返回True如果它比较相同的对象实例
而==最终由__eq__()方法确定
i.e.
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
你可能想读这个对象的身份和等价性。
语句'is'用于对象标识,它检查对象是否引用同一个实例(内存中相同的地址)。
而'=='语句指的是相等(相同的值)。
对于None,相等(==)和恒等式(is)之间不应该有区别。NoneType可能返回相等的标识。因为None是唯一可以使用NoneType的实例(我认为这是正确的),所以这两个操作是相同的。在其他类型的情况下,情况并非总是如此。例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
这将打印“Equal”,因为列表有一个比较操作,而不是默认返回的identity。
@Jason:
我建议使用类似于 如果foo: #foo不是None 其他: #foo为None
我不喜欢使用“if foo:”,除非foo真正代表一个布尔值(即0或1)。如果foo是一个字符串或对象或其他东西,“if foo:”可能工作,但它看起来像一个懒惰的快捷方式给我。如果你要检查x是否为None,请输入“If x is None:”。
提醒一句:
if foo:
# do something
并不完全等同于:
if x is not None:
# do something
前者是一个布尔值测试,可以在不同的上下文中计算为false。在布尔值测试中有很多东西表示为假例如空容器,布尔值。在这种情况下,None的值也为false,但其他东西也是如此。