226

有什么区别:

if foo is None: pass

if foo == None: pass

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

4

12 回答 12

263

isTrue如果比较相同的对象实例,总是返回

==最终由__eq__()方法决定

IE


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

>>> f = Foo()
>>> f == None
True
>>> f is None
False
于 2008-08-25T18:38:10.267 回答
50

您可能想阅读此对象标识和等效性

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

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

于 2008-08-25T18:48:20.163 回答
27

提醒一句:

if foo:
  # do something

完全一样:

if x is not None:
  # do something

前者是一个布尔值测试,可以在不同的上下文中评估为 false。在布尔值测试中,有很多东西代表错误,例如空容器、布尔值。在这种情况下,None 也评估为 false,但其他事情也一样。

于 2008-08-26T13:44:11.183 回答
13

(ob1 is ob2)等于(id(ob1) == id(ob2))

于 2009-02-25T10:34:49.333 回答
12

原因foo is None是首选方式是您可能正在处理定义其自己的对象__eq__,并且将对象定义为等于无。因此,foo is None如果您需要查看它是否为 infact ,请始终使用None

于 2010-05-28T21:15:53.207 回答
10

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

与 None 之类的单例的比较应始终使用 is 或 not 进行,而不是使用相等运算符。

于 2013-05-19T15:35:38.620 回答
9

is测试身份,而不是平等。对于您的语句foo is 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 is None总是如此。

In [101]: None is None
Out[101]: True
于 2014-12-19T04:05:39.903 回答
5

对于 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”,因为列表具有不是默认返回标识的比较操作。

于 2008-08-25T19:04:59.547 回答
5

@杰森

我建议使用更多类似的东西

if foo:
    #foo isn't None
else:
    #foo is None

我不喜欢使用“if foo:”,除非 foo 真正代表一个布尔值(即 0 或 1)。如果 foo 是一个字符串或一个对象或其他东西,“if foo:”可能会起作用,但它对我来说似乎是一个懒惰的捷径。如果您正在检查 x 是否为无,请说“如果 x 为无:”。

于 2008-08-25T21:35:14.850 回答
3

更多细节:

  1. is子句实际上检查两个objects 是否位于相同的内存位置。即它们是否都指向相同的内存位置并具有相同的id.

  2. 作为 1 的结果,is确保两个词法表示object的 s 是否具有相同的属性(attributes-of-attributes...)

  3. 具有相同值的原始类型(如bool, int, string)的实例化NoneType将始终位于相同的内存位置。

例如

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

于 2013-05-19T15:08:49.657 回答
1

John Machin 的None单例结论是由该代码支持的结论。

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

由于None是单例,x == None并且x is None会产生相同的结果。但是,以我的审美观点,x == None是最好的。

于 2011-03-27T19:31:59.653 回答
0
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
于 2019-04-03T07:11:47.513 回答