Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Création de listes

5 réponses
Avatar
Thomas Paviot
Bonjour,

Je suis confront=E9 depuis quelques jours =E0 un r=E9sultat que je
n'explique pas et pour lequel je n'ai pas trouv=E9 de documentation, qui
concerne la cr=E9ation de listes.

Je cr=E9e une liste a de la mani=E8re 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 =3D [[None,None]]*2
>>> a
[[None, None], [None, None]]
>>>

Je modifie alors le premier =E9l=E9ment de la premi=E8re liste pour passer
sa valeur =E0 1:
>>> a[0][0] =3D 1
>>>

Etonnament (et c'est l=E0 que je ne comprends pas), le premier =E9l=E9ment
de la deuxi=E8me liste est =E9galement modifi=E9:
>>> a
[[1, None], [1, None]]
>>>

Si je cr=E9e maintenant la liste b suivante:
>>> b =3D [[None,None],[None,None]]
>>> b
[[None, None], [None, None]]
>>> b[0][0] =3D 1
>>> b
[[1, None], [None, None]]
>>>

Dans ce deuxi=E8me cas, seule la valeur que j'ai explicitement chang=E9e
se trouve effectivement modifi=E9e.

Je ne comprends pas cette diff=E9rence de comportement entre deux
instances d'un m=EAme objet (a et b sont toutes deux du type liste et
contiennent les m=EAmes =E9l=E9ments). Tout se passe comme si une
"r=E9f=E9rence" implicite =E9tait conserv=E9e pour la liste a. Auriez-vous
quelques =E9l=E9ments d'explication ?

Cordialement,

Thomas Paviot

5 réponses

Avatar
jean-marc pouchoulon
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
Avatar
Damien Wyart
* Thomas Paviot in fr.comp.lang.python:
[...]
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
Avatar
Thomas Paviot
On 30 août, 10:59, Damien Wyart wrote:
* Thomas Paviot in fr.comp.lang.python:

> [...]
> 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
Avatar
Michel Claveau - MVP
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
Avatar
Francois Lafont
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