Considérez ce qui suit (Python 2.7.3, 64bit):
>>> a = "Hello"
>>> b = "Hello"
>>> a is b
True
stagiaires Python la chaîne courte 'Hello'
, en la mémorisant une seule fois. Ceci est un détail de mise en œuvre et est pas garantie par la norme linguistique. Il peut échouer sur des chaînes plus longues:
>>> a = "this is a long string"
>>> b = "this is a long string"
>>> a is b
False
estiment à présent:
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
a
et b
sont deux objets différents. Vous pouvez vérifier cela avec id()
:
>>> id(a)
33826696L
>>> id(b)
33826952L
Ceci est une bonne chose TM parce que quand vous faites
>>> a[0] = "Goodbye"
>>> a
['Goodbye']
>>> b
['Hello']
Cependant, si vous
>>> a = ["Hello"]
>>> b = a
>>> a is b
True
>>> a[0] = "Goodbye"
>>> b
['Goodbye']
parce a
et b
sont les noms qui se réfèrent au même objet (id(a) == id(b)
). Enfin, pour montrer que même si vous obtenez
>>> a = ["Hello"]
>>> b = ["Hello"]
>>> a is b
False
les chaînes sont encore internées et stockés qu'une seule fois:
>>> id(a[0])
33846096L
>>> id(b[0])
33846096L
excellent. Mais comment puis-je garantir que le nom fait référence à ce même objet? En d'autres termes, comment puis-je m'assurer que ce type d'optimisation est activé pour mon objet? Pourquoi Python ne peut-il pas réaliser que '['bonjour']' est fait deux fois? – user1730053
Essayez d'assigner vos listes à des variables, cela pourrait rendre les choses plus claires: l = ['hello'] l est l retournera Vrai, l = ['hello'] m = ['hello'] l est m retournera Faux – codebox
Si vous faites 'a = ['bonjour']; b = ['bonjour'] ',' a est b' sera faux parce que c'est deux objets différents. Après tout, vous ne voudriez pas que 'a [0] =" Au revoir "' affecte 'b', n'est-ce pas?Si vous faites 'a = ['bonjour']; b = a', cependant, 'a is b' sera True, et' a [0] = "Goodbye" 'affectera aussi' b'. –