当前位置:  开发笔记 > 编程语言 > 正文

"foo is None"和"foo == None"之间有什么区别吗?

如何解决《"fooisNone"和"foo==None"之间有什么区别吗?》经验,为你挑选了9个好方法。

之间有什么区别:

if foo is None: pass

if foo == None: pass

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



1> Brendan..:

isTrue如果它比较同一个对象实例,则总是返回

==最终由该__eq__()方法确定

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

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


您可能想要添加None是单例,因此"None is None"始终为True.
并且您可能想要添加"is"运算符无法自定义(由用户定义的类重载).

2> borrego..:

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

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

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



3> Tendayi Mawu..:

提醒一句:

if foo:
  # do something

不是完全一样:

if x is not None:
  # do something

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



4> Mykola Khare..:

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


不,不是的.`{}是{}`是false而`id({})== id({})`可以是(并且**在CPython中是**)为真.请参见http://stackoverflow.com/questions/3877230
......但是(ob是ob2)比较快.Timeit说"(a是b)"是每循环0.0365 usec而"(id(a)== id(b))"每循环0.153 usec.快4.2倍!
`is`版本不需要函数调用,根本不需要python-interpreter属性查找; 如果ob1实际上是ob2,则解释器可以立即回答.

5> truppo..:

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



6> Thijs van Di..:

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

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



7> ChillarAnand..:

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> Stephen Pell..:

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

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

这将打印“等于”,因为列表具有比较操作,而不是默认返回标识。



9> Graeme Perro..:

@ 杰森:

我建议按照以下方式使用更多内容

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

我不喜欢使用“ if foo:”,除非foo真正表示一个布尔值(即0或1)。如果foo是字符串或对象或其他对象,则“ if foo:”可能有效,但对我来说似乎是个懒惰的快捷方式。如果要检查x是否为None,请说“如果x为None:”。

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有