L'
is
opérateur ne correspond pas aux valeurs des variables, mais aux instances elles-mêmes.
Qu'est-ce que cela signifie vraiment?
J'ai déclaré deux variables nommées x
et y
affectant les mêmes valeurs dans les deux variables, mais cela renvoie false lorsque j'utilise l' is
opérateur.
J'ai besoin d'une clarification. Voici mon code.
x = [1, 2, 3]
y = [1, 2, 3]
print(x is y) # It prints false!
Réponses:
Vous avez mal compris ce que
is
teste l' opérateur. Il teste si deux variables pointent sur le même objet , pas si deux variables ont la même valeur.À partir de la documentation pour l'
is
opérateur :Utilisez
==
plutôt l' opérateur:Cela imprime
True
.x
ety
sont deux listes distinctes :Si vous utilisez la
id()
fonction, vous verrez celax
ety
aurez des identifiants différents:mais si vous deviez attribuer
y
àx
alors les deux pointent vers le même objet:et
is
montre que les deux sont le même objet, il retourneTrue
.N'oubliez pas qu'en Python, les noms ne sont que des étiquettes référençant des valeurs ; vous pouvez faire pointer plusieurs noms vers le même objet.
is
vous indique si deux noms pointent vers un seul et même objet.==
vous indique si deux noms font référence à des objets qui ont la même valeur.la source
A is B
c'est le même queid(A) == id(B)
.id(A)
dans une variable et que vousvariable == id(B)
vous attendiez plus tard à continuer de fonctionner; si elle aA
été supprimée entre-temps,B
le même emplacement de mémoire aurait pu être attribué.\n
>>> y = 5\n
>>> x est y\n
Vrai\n
>>> x == y\n
Vrai\n
>>>\n
Un autre doublon demandait pourquoi deux chaînes égales ne sont généralement pas identiques, ce qui n'est pas vraiment répondu ici:
Alors, pourquoi ne sont-ils pas la même chaîne? Surtout compte tenu de ceci:
Retardons un peu la deuxième partie. Comment le premier pourrait-il être vrai?
L'interpréteur devrait avoir une "table interne", une table mappant des valeurs de chaîne à des objets de chaîne, donc chaque fois que vous essayez de créer une nouvelle chaîne avec le contenu
'abc'
, vous récupérez le même objet. Wikipedia a une discussion plus détaillée sur le fonctionnement du stage.Et Python a une table interne de chaînes; vous pouvez manuellement interner des chaînes avec la
sys.intern
méthode.En fait, Python est autorisé à interner automatiquement tous les types immuables, mais pas obligé de le faire. Différentes implémentations intègreront différentes valeurs.
CPython (l'implémentation que vous utilisez si vous ne savez pas quelle implémentation vous utilisez) auto-interne de petits entiers et certains singletons spéciaux comme
False
, mais pas des chaînes (ou de grands entiers, ou de petits tuples, ou autre chose). Vous pouvez voir cela assez facilement:OK, mais pourquoi étaient
z
etw
identiques?Ce n'est pas l'interpréteur qui effectue automatiquement l'internation, ce sont les valeurs de repli du compilateur.
Si la même chaîne de compilation apparaît deux fois dans le même module (ce que cela signifie exactement est difficile à définir, ce n'est pas la même chose comme un littéral de chaîne, parce que
r'abc'
,'abc'
et'a' 'b' 'c'
sont toutes différentes littéraux , mais la même chaîne, mais facile à comprendre intuitivement), le compilateur ne créera qu'une seule instance de la chaîne, avec deux références.En fait, le compilateur peut aller encore plus loin:
'ab' + 'c'
peut être converti en'abc'
par l'optimiseur, auquel cas il peut être plié avec une'abc'
constante dans le même module.Encore une fois, c'est quelque chose que Python est autorisé mais pas obligé de faire. Mais dans ce cas, CPython plie toujours de petites chaînes (et aussi, par exemple, de petits tuples). (Bien que le compilateur instruction par instruction de l'interpréteur interactif n'exécute pas la même optimisation que le compilateur module à la fois, vous ne verrez donc pas exactement les mêmes résultats de manière interactive.)
Alors, que devez-vous faire à ce sujet en tant que programmeur?
Eh bien… rien. Vous n'avez presque jamais aucune raison de vous soucier si deux valeurs immuables sont identiques. Si vous voulez savoir quand vous pouvez utiliser à la
a is b
place dea == b
, vous posez la mauvaise question. Il suffit de toujours utilisera == b
sauf dans deux cas:x is None
.x
affectera ley
.la source
w
etz
sont identiques à cause des valeurs de repli du compilateur, pourquoi cela fonctionne-t-il également dans le REPL, même en utilisantid()
pour vérifier les références? Utilisation du REPL sur Python 3.7is
ne renvoie true que s'il s'agit en fait du même objet. S'ils étaient identiques, un changement dans l'un apparaîtrait également dans l'autre. Voici un exemple de la différence.la source
Invité par une question en double , cette analogie pourrait fonctionner:
la source
is
etis not
sont les deux opérateurs d'identité en Python.is
L'opérateur ne compare pas les valeurs des variables, mais compare les identités des variables. Considère ceci:L'exemple ci-dessus vous montre que l'identité (peut également être l'adresse mémoire en Cpython) est différente pour les deux
a
etb
(même si leurs valeurs sont identiques). C'est pourquoi lorsque vous ditesa is b
qu'il renvoie false en raison de la non-concordance dans les identités des deux opérandes. Cependant, lorsque vous ditesa == b
, il renvoie true car l'==
opération vérifie uniquement si les deux opérandes ont la même valeur qui leur est attribuée.Exemple intéressant (pour le grade supplémentaire):
Dans l'exemple ci-dessus, même si
a
etb
sont deux variables différentes,a is b
renvoyéesTrue
. C'est parce que le type dea
estint
qui est un objet immuable. Donc, python (je suppose pour économiser de la mémoire) a alloué le même objet àb
sa création avec la même valeur. Donc, dans ce cas, les identités des variables correspondaient eta is b
se sont avérées êtreTrue
.Cela s'appliquera à tous les objets immuables:
J'espère que cela pourra aider.
la source
-5
ou supérieur256
à Python sera faux. Python met en cache les nombres dans la plage [-5, 256].x is y
est identique à laid(x) == id(y)
comparaison de l'identité des objets.Comme @ tomasz-kurgan l'a souligné dans le commentaire ci-dessous, l'
is
opérateur se comporte de manière inhabituelle avec certains objets.Par exemple
Réf;
https://docs.python.org/2/reference/expressions.html#is-not
https://docs.python.org/2/reference/expressions.html#id24
la source
Comme vous pouvez le vérifier ici à un petit nombre entier. Les nombres supérieurs à 257 ne sont pas de petits nombres, ils sont donc calculés comme un objet différent.
Il est préférable d'utiliser à la
==
place dans ce cas.Plus d'informations ici: http://docs.python.org/2/c-api/int.html
la source
X pointe vers un tableau, Y pointe vers un autre tableau. Ces tableaux sont identiques, mais l'
is
opérateur examinera ces pointeurs, qui ne sont pas identiques.la source
is
fonctionnalité de l' opérateur le montre.id
moins que vous ne le demandiez.Il compare l'identité de l'objet, c'est-à-dire si les variables font référence au même objet en mémoire. C'est comme
==
dans Java ou C (en comparant les pointeurs).la source
Un exemple simple avec des fruits
Production:
Si tu essayes
La sortie est différente:
C'est parce que l'opérateur == compare uniquement le contenu de la variable. Pour comparer les identités de 2 variables, utilisez l' opérateur is
Pour imprimer le numéro d'identification:
la source
L'
is
opérateur n'est rien d'autre qu'une version anglaise de==
. Parce que les ID des deux listes sont différents, la réponse est fausse. Tu peux essayer:* Parce que les identifiants des deux listes seraient les mêmes
la source
is
n'est pas `` une version anglaise de==
''