Création de listes

Le
Thomas Paviot
Bonjour,

Je suis confronté depuis quelques jours à un résultat que je
n'explique pas et pour lequel je n'ai pas trouvé de documentation, qui
concerne la création de listes.

Je crée une liste a de la manière suivante:

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [[None,None]]*2
>>> a
[[None, None], [None, None]]
>>>

Je modifie alors le premier élément de la première liste pour passer
sa valeur à 1:
>>> a[0][0] = 1
>>>

Etonnament (et c'est là que je ne comprends pas), le premier élément
de la deuxième liste est également modifié:
>>> a
[[1, None], [1, None]]
>>>

Si je crée maintenant la liste b suivante:
>>> b = [[None,None],[None,None]]
>>> b
[[None, None], [None, None]]
>>> b[0][0] = 1
>>> b
[[1, None], [None, None]]
>>>

Dans ce deuxième cas, seule la valeur que j'ai explicitement changée
se trouve effectivement modifiée.

Je ne comprends pas cette différence de comportement entre deux
instances d'un même objet (a et b sont toutes deux du type liste et
contiennent les mêmes éléments). Tout se passe comme si une
"référence" implicite était conservée pour la liste a. Auriez-vous
quelques éléments d'explication ?

Cordialement,

Thomas Paviot
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jean-marc pouchoulon
Le #22519041
Le 30/08/2010 10:38, Thomas Paviot a écrit :
a = [[None,None]]*2



bonjour,

Dans le premier cas vous dupliquer le même objet avec le même id
a = [[None,None]]*2
a






[[None, None], [None, None]]
id(a[0])






27481152
id(a[1])






27481152








donc vous n'avez qu'un seul objet , ce qui explique le comportement

Dans le second cas vous avez deux objets distincts

a = [[None,None],[None,None]]
id(a[0])






23353624
id(a[1])






27483872
Damien Wyart
Le #22519031
* Thomas Paviot
[...]
Etonnament (et c'est là que je ne comprends pas), le premier élément
de la deuxième liste est également modifié:
>>> a
[[1, None], [1, None]]
>>>



Cela surprend souvent, mais c'est documenté. Voir la note 2 de la
section 5.6 du manuel de référence de la bibliothèque standard :
http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

--
DW
Thomas Paviot
Le #22519411
On 30 août, 10:59, Damien Wyart
* Thomas Paviot
> [...]
> Etonnament (et c'est là que je ne comprends pas), le premier élém ent
> de la deuxième liste est également modifié:
> >>> a
> [[1, None], [1, None]]

Cela surprend souvent, mais c'est documenté. Voir la note 2 de la
section 5.6 du manuel de référence de la bibliothèque standard :htt p://docs.python.org/library/stdtypes.html#sequence-types-str-unico...

--
DW



Merci beaucoup pour vos réponses éclairées.

Thomas Paviot
Michel Claveau - MVP
Le #22528381
Salut !

Moi, ce que j'ai toujours du mal à distinguer, c'est les parenthèses
"tuplantes" des parenthèses "factorisantes".

Exemple :
print [[1,2,3]]*3






[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

print [(1,2,3)]*3






[(1, 2, 3), (1, 2, 3), (1, 2, 3)]

print ((1,2,3))*3






(1, 2, 3, 1, 2, 3, 1, 2, 3)


ou encore :
print [(1,2,3)]+[(1,2,3)]+[(1,2,3)]






[(1, 2, 3), (1, 2, 3), (1, 2, 3)]

print ((1,2,3))+((1,2,3))+((1,2,3))






(1, 2, 3, 1, 2, 3, 1, 2, 3)


@-salutations
--
Michel Claveau
Francois Lafont
Le #22528471
Salut, :-)

Le 01/09/2010 07:54, Michel Claveau - MVP a écrit :

Moi, ce que j'ai toujours du mal à distinguer, c'est les parenthèses
"tuplantes" des parenthèses "factorisantes".




Je me lance dans une réponse, mais sans certitude absolue.

Je crois que ce qui les distingue c'est tout simplement la présence ou
non d'une virgule. Des parenthèses "factorisantes" ne délimitent
finalement qu'un seul objet (résultat d'une somme de plusieurs objets
par exemple, mais quand même un seul objet après évaluation) et dans ce
cas c'est l'absence de virgule qui permet de voir que ce n'est pas un
tuple :

(obj) # parenthèses "factorisantes"
(obj,) # parenthèses "tuplantes"


print ((1, 2, 3)) * 3






(1, 2, 3, 1, 2, 3, 1, 2, 3)
print ((1, 2, 3),) * 3






((1, 2, 3), (1, 2, 3), (1, 2, 3))



--
François Lafont
Publicité
Poster une réponse
Anonyme