1236 votes

Pourquoi comparer les chaînes en Python en utilisant soit ' == ' ou ' est ' parfois produire un résultat différent ?

J’ai un programme python où deux variables sont définies sur la valeur . Dans une expression conditionnelle, j’ai la comparaison qui se révélerait défectueuse, mais si j’ai changer de il retourne .

maintenant si j’ouvre mon interpréteur python et faire la même chose « est » comparaison qu'il réussit

Ce qui me manque ici ?

1613voto

SilentGhost Points 79627

est l’analyse d’identité, est un test d’égalité. que se passe-t-il dans votre code pourrait être imité dans l’interprète comme ceci :

alors, pas étonnant, ils ne sont pas les mêmes, droite ?

En d’autres termes : est le

620voto

Daniel Pryden Points 22167

SilentGhost et d'autres sont correct ici. is est utilisé pour l'identité par rapport à l' == est utilisé pour l'égalité de comparaison.

La raison pour laquelle cela fonctionne de manière interactive, c'est que la plupart des littéraux de chaîne sont internés par défaut. De Wikipedia:

Interné chaînes accélérer chaîne les comparaisons, qui sont parfois un goulot d'étranglement des performances dans les applications (tels que les compilateurs et dynamique langage de programmation de logiciels d'exécution) s'appuient fortement sur les tables de hachage avec clés de chaîne. Sans stage, vérifier que les deux chaînes sont égaux implique d'examiner chaque caractères des deux chaînes. C'est lent pour plusieurs raisons: c'est intrinsèquement O(n) dans la longueur de la les chaînes; il nécessite généralement de lit en provenance de plusieurs régions de la mémoire, qui prendre du temps; et le lit, elle remplit les cache du processeur, ce qui signifie qu'il est moins cache disponibles pour d'autres besoins. Avec interné cordes, un simple objet test d'identité suffit, après l' original stagiaire de l'opération; c'est généralement mis en œuvre comme un pointeur test d'égalité, normalement juste un seul instruction machine sans mémoire référence à tous.

Alors, quand vous avez deux littéraux de chaîne (les mots qui sont littéralement tapé dans votre code source du logiciel, entouré par des guillemets) dans votre programme qui ont la même valeur, le Python, le compilateur va automatiquement stagiaire les chaînes, les rendant à la fois stocké dans le même emplacement mémoire. (Notez que ce n'est pas toujours le cas, et le règles lorsque cela se produit sont assez compliquées, donc merci de ne pas compter sur ce problème dans le code de production!)

Car, dans votre session interactive les deux chaînes sont en fait stockées dans le même emplacement de mémoire, ils ont la même identité, de sorte que l' is opérateur fonctionne comme prévu. Mais si vous construisez une chaîne de caractères par une autre méthode (même si cette chaîne contient exactement les mêmes caractères), puis la chaîne peut être égal, mais ce n'est pas la même chaîne , -- c'est qu'il a une autre identité, car il est stocké dans un endroit différent dans la mémoire.

115voto

Thomas Owens Points 45042

Le mot clé est un test pour l’identité de l’objet tandis que est une valeur de comparaison.

Si vous utilisez , le résultat sera vrai si et seulement si l’objet est le même objet. Cependant, aura la valeur true n’importe quel moment les valeurs de l’objet sont les mêmes.

60voto

Jason Baker Points 56682

Une dernière chose à noter, vous pouvez utiliser la fonction de stagiaire pour s’assurer que vous obtenez une référence à la même chaîne :

Comme souligné plus haut, vous devriez être probablement pas faire est de déterminer l’égalité sur les chaînes. Mais cela peut être utile de savoir si vous avez une sorte de bizarre obligation d’utiliser `` .

Notez que la fonction de stagiaire a cessé d’être construit en fonction à être dans le module `` pour Python 3.

39voto

Gregg Lind Points 6905

Il s’agit d’une note de côté, mais en python idiomatiques, vous verrez souvent des choses comme :

C’est sans danger, parce qu’il est assuré d’être une instance de l’objet Null (c.-à-d. aucun).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X