J'utilise Python 2.x.
Mon éditeur me met en garde lorsque je compare my_var == None
, mais aucun avertissement lorsque j'utilise my_var is None
.
J'ai fait un test dans le shell Python et déterminé que la syntaxe était correcte, mais mon éditeur semble dire que my_var is None
est préférable.
Est-ce le cas, et si oui, pourquoi?
Utilisez is
lorsque vous souhaitez comparer un objet identité (par exemple, pour vérifier si var
est None
). Utilisez ==
lorsque vous souhaitez vérifier égalité (par exemple, var
est-il égal à 3
?).
Vous pouvez avoir des classes personnalisées où my_var == None
retournera True
par exemple:
class Negator(object):
def __eq__(self,other):
return not other
thing = Negator()
print thing == None #True
print thing is None #False
is
recherche un objet identité. Il n'y a qu'un seul objet None
, donc lorsque vous faites my_var is None
, vous vérifiez s'il s'agit bien du même objet (pas seulement équivalent objets)
En d'autres termes, ==
est une vérification d'équivalence (définie d'objet à objet) alors que is
vérifie l'identité de l'objet:
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
est généralement préférable lorsque l'on compare des objets arbitraires à des singletons tels que None
, car il est plus rapide et plus prévisible. is
compare toujours par identité d'objet, tandis que ce que ==
dépend du type exact des opérandes et même de leur ordre.
Cette recommandation est appuyée par PEP 8 , qui indique explicitement que "les comparaisons avec des singletons tels que None doivent toujours être effectuées avec is
ou is not
, jamais les opérateurs d'égalité. "
PEP 8 définit qu'il est préférable d'utiliser l'opérateur is
pour comparer des singletons.