之间有什么区别:

if foo is None: pass

if foo == None: pass

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

===============>>#1 票数:251 已采纳

如果它比较同一个对象实例, is始终返回True

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


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

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

===============>>#2 票数:48

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

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

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

===============>>#3 票数:24

提醒一句:

if foo:
  # do something

完全相同:

if x is not None:
  # do something

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

===============>>#4 票数:12

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

===============>>#5 票数:12

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

===============>>#6 票数:8

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

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

===============>>#7 票数:7

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

===============>>#8 票数:4

对于None,等于(==)和identity(是)之间不应该有区别。 NoneType可能返回相等的标识。 由于None是唯一可以使用NoneType的实例(我认为这是真的),因此两个操作是相同的。 在其他类型的情况下,情况并非总是如此。 例如:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

这将打印“Equal”,因为列表的比较操作不是默认的身份返回。

===============>>#9 票数:4

@ 杰森

我建议使用更多的东西

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

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

===============>>#10 票数:2

更多细节:

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

  2. 作为1的结果, is确保是否与否,两个词汇表示object ■找相同属性(属性-的的属性...)或不

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

===============>>#11 票数:1

John Machin的结论是None是一个单身,这个结论得到了这个代码的支持。

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

由于None是单例, x == Nonex is None将具有相同的结果。 但是,根据我的美学观点, x == None是最好的。

===============>>#12 票数: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

  ask by Joe Shaw translate from so

未解决问题?本站智能推荐: