之间有什么区别:

if foo is None: pass

if foo == None: pass

我在大多数 Python 代码(以及我自己编写的代码)中看到的约定是前者,但我最近遇到了使用后者的代码。None 是 NoneType 的实例(也是唯一的实例,IIRC),所以这应该不重要,对吗?是否存在可能发生这种情况的情况?

有帮助吗?

解决方案

is 总是返回 True 如果它比较相同的对象实例

然而 == 最终由 __eq__() 方法

IE。


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

>>> f = Foo()
>>> f == None
True
>>> f is None
False

其他提示

您可能想阅读此内容 对象同一性和等价性.

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

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

温馨提示:

if foo:
  # do something

不是 与以下完全相同:

if x is not None:
  # do something

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

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

原因 foo is None 首选方法是您可能正在处理定义其自己的对象 __eq__, ,并且该对象定义为等于 None。所以,总是使用 foo is None 如果你需要看看它是否确实如此 None.

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

与像 None 这样的单例的比较应该总是使用 is 或 is not 来完成,而不是使用相等运算符。

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

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

@贾森:

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

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

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

更多细节:

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

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

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

约翰·梅钦的结论是 None is a singleton 是此代码支持的结论。

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

自从 None 是一个单例, x == Nonex is None 会得到相同的结果。然而,以我的审美观来说, x == None 是最好的。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top