Python None comparison: should I use “is” or ==?
Possible Duplicate:
When is the `==` operator not equivalent to the `is` operator? (Python)
我使用的是python2.x。
当我比较my_var == None时,我的编辑给了我一个"警告"下划线,但是当我使用my_var is None时,没有警告。
我在python shell中做了一个测试,并确定两者都是有效的语法,但我的编辑器似乎说my_var is None是首选的。
是这样吗?如果是这样,为什么?
- PEP 8说的地方,你应该使用的单身人士的出现is- python.org / dev / / / PEP peps 0.008 #设计建议
- that is about Python 3海报说,和我的问题是关于Python的2.x. if this is a am not sure to both权证剩余差足够大,但这只是问题的edited包括住房。
- 我不认为这是真的在重复的问题。was about the other is = vs is about this在一个通用的,不考虑。
- 如果你thefourtheye reopening @我的道理,Please remove the to the复制链接,请关闭其他的问题。
总结:
当您想检查对象的身份时(例如,检查var是否为None),请使用is。当您想检查相等性时,使用==(例如,var等于3吗?).
说明:
您可以有自定义类,其中my_var == None将返回True。
例如:
1 2 3 4 5 6 7
| class Negator(object):
def __eq__(self,other):
return not other
thing = Negator()
print thing == None #True
print thing is None #False |
is检查对象标识。只有一个对象None,所以当你做my_var is None的时候,你会检查它们是否是同一个对象(不仅仅是等价对象)。
换言之,==是对等价性的检查(从对象到对象定义),而is是对对象标识的检查:
1 2 3
| lst = [1,2,3]
lst == lst[:] # This is True since the lists are"equivalent"
lst is lst[:] # This is False since they're actually different objects |
- 您的意思是重载==运算符,使其在与"无"相比时始终返回"真"吗?
- is None与== None什么时候不同?
- @上述情况下的搅拌机。__eq__可以用任何方式来定义,但是is的行为不能这么容易地改变。
- @Levlevitsky——据我所知,is的行为是无法改变的……
- @那太疯狂了:)
- 啊,最后一个关于lst的例子很清楚。谢谢您。
- @Levlevitsky:Mython的一个示例用法是"扩展协议以便任何操作员都可以过载,甚至是is"。在对名单发表评论后,他将其改为:"……甚至是is(但前提是你疯了。"
- +1,但如果这个答案包括其他人引用的PEP8(以及解释为什么PEP8背后的决策是有意义的,它已经这样做了),那就更好了。
- @Abarnett——我甚至不知道Pep8在这里提出了一个建议。关键是他们是做不同事情的不同操作员。有些情况下,object == None实际上是正确的成语(尽管我脑子里想不出任何正确的成语)。你只需要知道你在做什么。
- @Levlevitsky我总是用一个助记词来记住"is比较地址,==比较值"。我用这个助记符一天也没出错。这样一来,改变is的实现方式就像是伪造另一个地址。
- @mgilson如果你使用其他语言,或者Java例如,a == null表示a的值(或指针值)实际上只是一个特殊的文字,叫做null,既不是实例,也不是可比的值。python没有这个功能,None是NoneType类的单例实例。a == None会很疯狂,因为我可以每次都覆盖__eq__并使它等于None,即使它不是这样。同时,a is None只是简单地把一个应该代表世界上所有空物体的单体物体的地址等同起来。
- @如你所见,在python中,惯用的a is None比a == None更有意义。
当比较任意物体和单体物体(如None)时,通常首选is,因为它更快,更容易预测。is总是按对象标识进行比较,而==将做什么取决于操作数的确切类型,甚至取决于它们的顺序。
这一建议得到了PEP 8的支持,PEP 8明确指出,"与诸如none这样的单件产品进行比较时,应始终使用is或is not,而不是使用相等运算符。"
- 感谢您发表这篇文章;接受的答案有一些有趣的地方,但您的回答更直接。
- 依赖于实质上的实现细节似乎很奇怪。为什么我要关心有多少非类型的实例?
- @因为它不是一个实现细节——在全局常量None下只有一个None对象。如果有的话,NoneType是一个实现细节,因为None单例必须具有某种类型。(无法创建此类型的实例这一事实很好地表明,它的一个实例打算是单实例。)
- @我认为关键是python有一个很强的对象标识概念。如果您想检查一个对象是否与None比较,请务必使用obj == None。如果要检查对象是否为None,请使用obj is None。政治公众人物8的建议(以及这个答案)的要点是,大多数人在不想检查的时候都想要后者,而且它也恰好更快更清晰。
- None也不同于缓存对象,如0和其他小整数,其中缓存实际上是一个实现细节。不同的是,一个整数有一个内在的值,它给出了它的属性,并且它可以被计算出来。另一方面,None没有任何状态,只有它的身份才是重要的,并使它与众不同。
PEP8定义比较单件时最好使用is运算符。