Mon éditeur m'avertit 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 j'ai déterminé que les deux sont une syntaxe valide, mais mon éditeur semble dire que my_var is None
c'est préférable.
Est-ce le cas, et si oui, pourquoi?
python
comparison
nonetype
Clay Wardell
la source
la source
is
- python.org/dev/peps/pep-0008/#programming-recommendationsRéponses:
Résumé:
À utiliser
is
lorsque vous souhaitez vérifier l' identité d' un objet (par exemple, vérifier sivar
c'est le casNone
). À utiliser==
lorsque vous souhaitez vérifier l' égalité (par exemple Isvar
égal à3
?).Explication:
Vous pouvez avoir des classes personnalisées où
my_var == None
reviendrontTrue
par exemple:
is
vérifie l' identité de l' objet . Il n'y a qu'un seul objetNone
, donc quand vous le faitesmy_var is None
, vous vérifiez s'il s'agit bien du même objet (pas seulement des objets équivalents )En d'autres termes,
==
est une vérification d'équivalence (qui est définie d'objet à objet) tandis queis
vérifie l'identité d'objet:la source
is None
diffère-== None
t-il?__eq__
peut être défini de quelque façon que ce soit, mais le comportement deis
ne peut pas être modifié si facilement.is
". Après un commentaire sur les listes, il a changé cela en "… mêmeis
(mais seulement si vous êtes fou)."object == None
fait c'est le bon idiome (bien que je ne puisse pas penser à n'importe quoi du haut de ma tête). Vous avez juste besoin de savoir ce que vous faites.is
est généralement préféré lors de la comparaison d'objets arbitraires à des singletons commeNone
parce qu'il est plus rapide et plus prévisible.is
compare toujours par identité d'objet, tandis que ce qui==
va dépendre du type exact des opérandes et même de leur ordre.Cette recommandation est soutenue par le PEP 8 , qui déclare explicitement que "les comparaisons avec des singletons comme None devraient toujours être faites avec
is
ouis not
, jamais avec les opérateurs d'égalité".la source
None
objet sous la constante globaleNone
. Si quelque chose,NoneType
c'est un détail d'implémentation parce que leNone
singleton doit avoir un certain type. (Le fait que vous ne puissiez pas créer d'instances de ce type est une bonne indication que sa seule instance est destinée à être un singleton.)None
, par tous les moyens utiliserobj == None
. Si vous souhaitez vérifier si un objet l' estNone
, utilisezobj is None
. Le point de la recommandation PEP 8 (et de cette réponse) est que la plupart des gens veulent ce dernier quand ils veulent vérifier Aucun, et il se trouve également que c'est plus rapide et plus clair.None
est également différent des objets mis en cache comme0
et d'autres petits entiers, où la mise en cache est vraiment un détail d'implémentation. La différence est qu'un entier a une valeur intrinsèque qui donne ses propriétés et qu'il peut être calculé. D'un autre côté,None
n'a aucun état, c'est seulement son identité qui compte et la rend spéciale.PEP 8 définit qu'il est préférable d'utiliser l'
is
opérateur lors de la comparaison de singletons.la source