63 votes

Python: Pourquoi ("hello" est "hello")?

Pourquoi "hello" is "hello" == True en Python?

J'ai lu ce qui suit ici :

 "If two string literals are equal, they have been put to same
 memory location. A string is an immutable entity. No harm can
 be done."
 

Donc, il y a un et un seul endroit en mémoire pour chaque chaîne Python? Cela semble assez étrange. Que se passe t-il ici?

93voto

carl Points 25879

Python (comme Java, C, C ++, .NET) utilise le pooling / interning de chaînes. L'interprète se rend compte que "hello" est identique à "hello", il optimise donc et utilise le même emplacement en mémoire.

Un autre bonus: "hell" + "o" est "hello" ==> True

65voto

bobince Points 270740

Il existe donc un et un seul de la place en mémoire pour chaque chaîne Python?

Non, seulement ceux que l'interprète a décidé d'optimiser, ce qui est une décision basée sur une politique qui ne fait pas partie de la spécification du langage et qui peuvent changer Disponible dans différentes versions.

par exemple. sur mon installation (2.6.2 Linux):

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

de même, pour les entiers:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

Donc, ne comptez pas sur la 'chaîne' est un 'string': même simplement en regardant la C mise en œuvre, il n'est pas sûr.

13voto

Quantumplation Points 428

Les chaînes littérales sont probablement regroupées en fonction de leur hachage ou de quelque chose de similaire. Deux chaînes littérales identiques seront stockées dans la même mémoire, et toutes les références font référence à cela.

  Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
 

6voto

IfLoop Points 59461

L'opérateur is renvoie true si les deux arguments sont le même objet. Votre résultat est une conséquence de cela, et le bit cité.

Dans le cas de littéraux de chaîne, ceux-ci sont internés, ce qui signifie qu'ils sont comparés à des chaînes connues. Si une chaîne identique est déjà connue, le littéral prend cette valeur au lieu d'une autre. Ainsi, ils deviennent le même objet et l'expression est vraie.

2voto

unwind Points 181987

L'interpréteur / compilateur Python analyse les littéraux de chaîne, c'est-à-dire la liste de caractères citée. Lorsque cela se produit, il peut détecter "J'ai déjà vu cette chaîne" et utiliser la même représentation que la dernière fois. Il peut le faire car il sait que les chaînes définies de cette manière ne peuvent pas être modifiées.

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