Y a-t-il une différence entre:
if foo is None: pass
et
if foo == None: pass
La convention que j'ai vue dans la plupart du code Python (et le code que j'écris moi-même) est la première, mais j'ai récemment rencontré du code qui utilise la seconde. Aucun n'est une instance (et la seule instance, IIRC) de NoneType, donc cela ne devrait pas avoir d'importance, non? Y a-t-il des circonstances dans lesquelles cela pourrait se produire?
is
opérateur ne peut pas être personnalisé (surchargé par une classe définie par l'utilisateur).__eq__(self)
est une méthode intégrée spéciale qui détermine comment elle==
est gérée lorsqu'elle est utilisée sur un objet Python. Ici, nous l'avons remplacé de sorte que lorsqu'il==
est utilisé sur des objets de type,Foo
il renvoie toujours true. Il n'y a pas de méthode équivalente pour l'is
opérateur et le comportement deis
ne peut donc pas être modifié de la même manière.Vous voudrez peut-être lire l' identité et l'équivalence de cet objet .
L'instruction «est» est utilisée pour l'identité de l'objet, elle vérifie si les objets se réfèrent à la même instance (même adresse en mémoire).
Et l'instruction '==' fait référence à l'égalité (même valeur).
la source
a=1;b=1;print(a is b) # True
. Une idée pourquoia is b
se révéler vrai même s'ils semblent être 2 objets différents (adresse différente en mémoire)?Un mot d'avertissement:
N'est pas exactement le même que:
Le premier est un test de valeur booléenne et peut être évalué à faux dans différents contextes. Il y a un certain nombre de choses qui représentent faux dans une valeur booléenne teste par exemple des conteneurs vides, des valeurs booléennes. Aucun n'évalue également faux dans cette situation, mais d'autres choses aussi.
la source
(ob1 is ob2)
égal à(id(ob1) == id(ob2))
la source
is
version n'a besoin d'aucun appel de fonction et d'aucune recherche d'attribut python-interpreter; l'interprète peut répondre immédiatement si ob1 est, en fait, ob2.{} is {}
est faux etid({}) == id({})
peut être (et est en CPython) vrai. Voir stackoverflow.com/questions/3877230La raison en
foo is None
est que la méthode préférée est que vous pourriez manipuler un objet qui définit le sien__eq__
, et qui définit l'objet comme égal à Aucun. Donc, utilisez toujoursfoo is None
si vous avez besoin de voir si c'est infactNone
.la source
Il n'y a pas de différence car les objets identiques seront bien sûr égaux. Cependant, PEP 8 indique clairement que vous devez utiliser
is
:la source
is
tests d'identité, pas d' égalité. Pour votre déclarationfoo is none
, Python compare simplement l'adresse mémoire des objets. Cela signifie que vous posez la question "Ai-je deux noms pour le même objet?"==
d'autre part, teste l'égalité telle que déterminée par la__eq__()
méthode. Peu importe l'identité.None
est un opérateur singleton. C'estNone is None
toujours vrai.la source
Pour None, il ne devrait pas y avoir de différence entre l'égalité (==) et l'identité (is). Le NoneType renvoie probablement l'identité pour l'égalité. Puisque None est la seule instance que vous pouvez faire de NoneType (je pense que c'est vrai), les deux opérations sont les mêmes. Dans le cas d'autres types, ce n'est pas toujours le cas. Par exemple:
Cela afficherait "Equal" car les listes ont une opération de comparaison qui n'est pas le retour d'identité par défaut.
la source
@ Jason :
Je n'aime pas utiliser "if foo:" à moins que foo ne représente vraiment une valeur booléenne (c'est-à-dire 0 ou 1). Si foo est une chaîne ou un objet ou quelque chose d'autre, "if foo:" peut fonctionner, mais cela ressemble à un raccourci paresseux pour moi. Si vous vérifiez si x est Aucun, dites "si x est Aucun:".
la source
if foo
retournera false et le commentaire#foo is None
est erroné.Quelques détails supplémentaires:
La
is
clause vérifie en fait si les deuxobject
s sont au même emplacement mémoire ou non. c'est-à-dire s'ils pointent tous deux vers le même emplacement mémoire et ont le mêmeid
.En conséquence de 1,
is
assure si oui ou non les deuxobject
s lexicalement représentés ont des attributs identiques (attributs-d'attributs ...) ou nonInstanciation des types primitifs comme
bool
,int
,string
(à quelques exceptions près),NoneType
ayant une même valeur sera toujours dans le même emplacement mémoire.Par exemple
Et comme
NoneType
il ne peut y avoir qu'une seule instance de lui-même dans la table de "recherche" du python, le premier et le second sont plus un style de programmation du développeur qui a écrit le code (peut-être pour la cohérence) plutôt que d'avoir une raison logique subtile de choisissez l'un plutôt que l'autre.la source
some_string is "bar"
pour comparer les chaînes JAMAIS. Il n'y a PAS UNE SEULE RAISON ACCEPTABLE pour le faire et cela CASSERA quand vous ne vous y attendez pas. Le fait que cela fonctionne souvent est simplement parce que CPython sait qu'il serait stupide de créer deux objets immuables qui ont le même contenu. Mais cela peut néanmoins arriver.int
, non?La conclusion de John Machin qui
None
est un singleton est une conclusion renforcée par ce code.Depuis
None
est un singleton,x == None
etx is None
aurait le même résultat. Cependant, à mon avis esthétique,x == None
c'est mieux.la source
None
objet. Par comparaison, on voit rarement None utilisé dans un autre contexte, sauf pour être similaire àFalse
d'autres valeurs étant véridiques. Dans ces cas, il est plus idiomatique de faire quelque chose commeif x: pass
la source