2012-10-09 4 views

Répondre

8

Les tests de l'opérateur is pour voir si deux références d'objet se réfèrent au même objet (il est pas un opérateur d'égalité, mais un opérateur d'identité). Dans votre exemple, vous avez créé deux listes distinctes, donc vous avez deux objets différents, ce qui est la raison pour laquelle vous voyez False retourné.

+0

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

+2

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

+0

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'. –

1

Lorsque vous créez une liste en utilisant la syntaxe [], un nouvel objet de liste est créé. Les listes sont des objets mutables et donc, même si deux listes contiennent les mêmes éléments, ce ne sont pas les mêmes objets. Vous pouvez observer que la modification d'une liste en appelant une de ses méthodes de modification ne en fait pas changer l'ID:

In [1]: a = ["hello"] 
In [2]: b = ["hello"] 
In [3]: id(a) 
Out[3]: 4477468112 
In [4]: id(b) 
Out[4]: 4477467824 
In [5]: a.append("world") 
In [6]: id(a) 
Out[6]: 4477468112 
+0

'" Pour les objets immuables, par exemple les chaînes, différentes variables se référeront en fait au même objet "' ce n'est pas correct. Voir la réponse de Tim Pietzcker à ce sujet. – phant0m

+0

Oui, merci pour l'indice. J'ai supprimé cette partie. – silvado

10

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