Il n'est pas clair si cette question concerne isvs ==, ou sur la nature de ce qui Noneest exactement et comment le comportement diffère dans l'un ou l'autre contexte (ce dernier est la raison pour laquelle je me suis retrouvé ici). Basé sur le flou et le manque de réponses OP ... Je suis surpris que cela ait autant de votes positifs. Je veux dire ... cmon ... la question n'est même pas écrite dans la vraie question ...
Une classe est libre d'implémenter la comparaison comme elle l'entend, et elle peut choisir de faire une comparaison avec None signifie quelque chose (ce qui a du sens; si quelqu'un vous a dit d'implémenter l'objet None à partir de zéro, comment pourriez-vous le faire comparer True contre lui-même?).
En pratique, il n'y a pas beaucoup de différence car les opérateurs de comparaison personnalisés sont rares. Mais vous devez utiliser is Noneen règle générale.
@ myusuf3 Vous n'avez pas vraiment besoin d'une preuve pour cela. isest, fondamentalement, une comparaison entière alors que ==non seulement la résolution des références mais la comparaison des valeurs qui peuvent avoir des types incompatibles.
Pijusn
4
Un en faveur de "est". Lorsqu'une variable peut être None ou quelque chose qui n'a aucune comparaison significative avec None. Par exemple, une variable peut être un numpy.array ou None (mon cas particulier).
Jblasco
3
Je voudrais ajouter à ce que dit @TimLudwinski: premièrement, si quelqu'un choisit de remplacer l'opérateur d'égalité pour faire de None un cas spécial, pourquoi voudrions-nous lui dire le contraire? Deuxièmement, "Il devrait y avoir une - et de préférence une seule - manière évidente de le faire." Et le moyen évident de vérifier si quelque chose est égal à quelque chose est, bien, l'opérateur d'égalité.
Cette réponse n'est pas correcte, comme expliqué dans la réponse de Ben Hoffstein ci-dessous stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonepeut s'évaluer Truemême si ce xn'est pas le cas, Nonemais une instance d'une classe avec son propre opérateur d'égalité personnalisé.
max
5
Si vous utilisez numpy,
if np.zeros(3)==None:pass
vous donnera une erreur lorsque numpy fait une comparaison élément par élément
Cela dépend de ce que vous comparez à Aucun. Certaines classes ont des méthodes de comparaison personnalisées qui == Nonediffèrent de is None.
En particulier, la sortie de a == Nonene doit même pas être booléenne !! - une cause fréquente de bugs.
Pour un exemple spécifique, prenez un tableau numpy où la ==comparaison est implémentée élément par élément:
import numpy as np
a = np.zeros(3)# now a is array([0., 0., 0.])
a ==None#compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a isNone#compares object to object, outputs False
==
is
is
vs==
, ou sur la nature de ce quiNone
est exactement et comment le comportement diffère dans l'un ou l'autre contexte (ce dernier est la raison pour laquelle je me suis retrouvé ici). Basé sur le flou et le manque de réponses OP ... Je suis surpris que cela ait autant de votes positifs. Je veux dire ... cmon ... la question n'est même pas écrite dans la vraie question ...Réponses:
La réponse est expliquée ici .
Citer:
En pratique, il n'y a pas beaucoup de différence car les opérateurs de comparaison personnalisés sont rares. Mais vous devez utiliser
is None
en règle générale.la source
is None
est un peu (~ 50%) plus rapide que== None
:)is
est, fondamentalement, une comparaison entière alors que==
non seulement la résolution des références mais la comparaison des valeurs qui peuvent avoir des types incompatibles.la source
Dans ce cas, ce sont les mêmes.
None
est un objet singleton (il n'en existe qu'un seulNone
).is
vérifie si l'objet est le même, tandis que == vérifie simplement s'ils sont équivalents.Par exemple:
Mais puisqu'il n'y en a qu'un
None
, ils seront toujours les mêmes etis
renverront True.la source
x == None
peut s'évaluerTrue
même si cex
n'est pas le cas,None
mais une instance d'une classe avec son propre opérateur d'égalité personnalisé.Si vous utilisez numpy,
vous donnera une erreur lorsque numpy fait une comparaison élément par élément
la source
Cela dépend de ce que vous comparez à Aucun. Certaines classes ont des méthodes de comparaison personnalisées qui
== None
diffèrent deis None
.En particulier, la sortie de
a == None
ne doit même pas être booléenne !! - une cause fréquente de bugs.Pour un exemple spécifique, prenez un tableau numpy où la
==
comparaison est implémentée élément par élément:la source