Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/12/2020, à 08:18

chris7522

Nuance entre 2 exemples Références partagées ( Python )

Bonjour a toutes et a tous ,
Je ne parviens pas a saisir la nuance entre ces 2 exemples qui parviennent au meme résultat  :
1 er :

cellule = [0]
liste = [cellule, cellule, cellule]
# puis
liste[0][0] = 1 

En tapant liste , j'obtiens :

[[1],[1],[1]]

# La , j'affecte a ma variable 'cellule' une liste de valeur 0
# puis j'affecte a ma variable liste  3 fois cellules , ce qui me donne apres avoir tapé ' liste ':

[[0],[0],[0]]

Les 3 éléments de liste étant mutable , leur références est partagées .
#Donc si je fais :

liste[0][0] = 1 

# je réaffecte au 1 er élément de liste la valeur 1 , et comme toutes les références sont partagés,
# cela va me donner :

[[1],[1],[1]]

Jusqu'a la pas de probleme .
Par contre pour mon 2 ème exemple :

cellule = [0]
liste = [cellule, cellule, cellule]
# puis
cellule[0] = 1

# En tapant liste , j'obtiens aussi :

[[1],[1],[1]]

# Cette fois ci , le début de l'exemple est le meme
# Mais ensuite je fais :

 cellule[0] = 1 

# Je n'actualise pas la variable liste avec ce changement et pourtant  en tapant liste j'obtiens également ::

[[1],[1],[1]]

Que se passe t il ?

Dernière modification par chris7522 (Le 29/12/2020, à 08:27)

Hors ligne

#2 Le 29/12/2020, à 09:27

Compte supprimé

Re : Nuance entre 2 exemples Références partagées ( Python )

Bonjour,
dans ton 1er cas comme dans ton 2eme, tu modifies l objet mutable cellule, qui par effet de bord modifie l'ensemble des références partagées (avec list cellule)...
Si cela n'est pas souhaité, il te faut travailler sur une copy de ta liste:

>>> cellule = [0]
>>> liste = [cellule[:], cellule[:], cellule[:]]
>>> liste [0] [0] = 1
>>> liste
[[1], [0], [0]]

#3 Le 29/12/2020, à 09:33

ar barzh paour

Re : Nuance entre 2 exemples Références partagées ( Python )

liste1 étant un objet list
si on écrit liste2=liste1 ,
on ne crée pas un deuxième objet list mais un alias de l'objet liste1
list1 et liste2 pointe en mémoire sur le même objet
le fait de modifier l'un ,modifie l'autre
liste1=['je','sais']
>>> liste1
['je', 'sais']

>>> liste2=liste1
>>> liste2
['je', 'sais']

modification de liste1
>>> liste1[0]="tu"

la modification se répercute sur liste2
>>> liste2
['tu', 'sais']

on dit que ce sont des "alias"


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#4 Le 30/12/2020, à 11:20

chris7522

Re : Nuance entre 2 exemples Références partagées ( Python )

Bien compris .
Je vous remercie tous les deux smile

Par contre si je fais :
cellule = [22]                                               

liste = [cellule,cellule,cellule]
Ok , j'obtiens un effet de bord :

liste                                                         
[[22], [22], [22]]

si je change la valeur de cellule , j'ai encore un effet de bord :

cellule[0] = 33                                               

liste                                                         
[[33], [33], [33]]

Si je change la 1 ère valeur de liste ensuite :

liste[0] = [45]                                               

liste                                                         
[[45], [33], [33]]

Puis si je fais de nouveau :

cellule[0] = 99

j'obtiens en tapant liste :

liste                                                         
[[45], [99], [99]]

Il n'y a pas eu d'effet de bord pour la 1 ere valeur de liste .
Pourquoi ?

Dernière modification par chris7522 (Le 30/12/2020, à 12:13)

Hors ligne

#5 Le 30/12/2020, à 13:14

ar barzh paour

Re : Nuance entre 2 exemples Références partagées ( Python )

un peu de lecture
https://docs.python.org/fr/3.8/tutorial/

une explication
1) tu définis liste comme étant une liste de liste

liste = [cellule,cellule,cellule] 

on a donc liste[0] qui pointe sur la liste cellule
2) tu redéfinis ensuite liste[0] comme une liste [45] ,

liste[0]=[45]

liste[0] n'a plus rien a voir avec la liste cellule
par contre liste[1] et liste[2] n'ont pas bougé


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#6 Le 31/12/2020, à 10:12

chris7522

Re : Nuance entre 2 exemples Références partagées ( Python )

Ok bien compris , merci

Hors ligne