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

if foo is None: pass

and

if foo == None: pass

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


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,但其他东西也是如此。


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


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是最好的。


更多细节:

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的“查找”表中只能有一个自身的实例,因此前者和后者更多的是编写代码的开发人员的编程风格(可能是为了一致性),而不是有任何微妙的逻辑原因来选择一个而不是另一个。


没有区别,因为相同的对象当然是相等的。然而,PEP 8明确指出您应该使用的是:

与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。


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

a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True