web-dev-qa-db-fra.com

Python Aucune comparaison: dois-je utiliser "est" ou ==?

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?

171
Clay Wardell

Sommaire:

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?).

Explication:

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
220
mgilson

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é. "

108
user4815162342

PEP 8 définit qu'il est préférable d'utiliser l'opérateur is pour comparer des singletons.

10
Thorsten Kranz