Python无比较:我应该使用“is”还是==?

可能重复:
什么时候“==”操作符不等于“is”操作符? (python)

我正在使用Python 2.x.

当我比较my_var == None ,我的编辑器给我一个“警告”下划线,但是当我使用my_var is None时没有警告my_var is None

我在Python shell中做了一个testing,并确定这两个语法都是有效的,但是我的编辑器似乎是说my_var is None是首选的。

是这样,如果是这样,为什么?

概要:

使用is当你想检查对象的身份 (例如检查var是否)。 当你想检查相等 (如var等于3 ?)时使用==

说明:

你可以有自定义类,其中my_var == None将返回True

例如:

 class Negator(object): def __eq__(self,other): return not other thing = Negator() print thing == None #True print thing is None #False 

is检查对象身份 。 只有1个对象None ,所以当你做my_var is None ,你检查他们是否实际上是相同的对象(不只是等价的对象)

换句话说, ==是等价的检查(从对象到对象定义),而检查对象的身份:

 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 

通常比较任意对象与单例如None因为它更快,更可预测。 总是通过对象身份进行比较,而==会做什么取决于操作数的确切types,甚至取决于它们的sorting。

PEP 8支持这一build议, PEP 8 明确指出 :“比较像None这样的单身人士应该总是用” is还是” is not ,而不是平等运算符。

PEP 8定义在比较单例时最好使用is运算符。