modification de ma variable Python

Messages : 0

Inscription : 20 oct. 2020 17:08

Profil de l'utilisateur : Élève de lycée

modification de ma variable Python

Message par Charles Lambert » 20 oct. 2020 17:12

Bonjour, j'ai créé ce programme pour un DM d'info :
def pref(lst):
lst_pref = lst
for i in range (1,len(lst)):
lst_pref = lst_pref[i-1]*lst
return(lst_pref)

Je ne comprends pas pourquoi ma variable (lst) est modifiée à la fin du programme
Merci d'avance pour la réponse

Messages : 0

Inscription : 13 janv. 2020 07:47

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par Logarithme_Neperien » 21 oct. 2020 08:45

Ta variable (ton entrée) lst n'est pas modifié dans ton programme (rajouter un print(lst) à la fin pour s'en convaincre), contrairement à la variable locale lst_pref qui subit les transformations de la ligne 4 et qui est celle que tu renvoie à la fin, est-ce de cette dernière dont tu parle ?

Messages : 0

Inscription : 20 oct. 2020 17:08

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par Charles Lambert » 21 oct. 2020 10:18

Logarithme_Neperien a écrit :
21 oct. 2020 08:45
Ta variable (ton entrée) lst n'est pas modifié dans ton programme (rajouter un print(lst) à la fin pour s'en convaincre), contrairement à la variable locale lst_pref qui subit les transformations de la ligne 4 et qui est celle que tu renvoie à la fin, est-ce de cette dernière dont tu parle ?

Pourtant elle l'est quand je fais tourner le programme, c'est donc pour cela que je pose la question, car je ne comprends pas pourquoi elle est modifiée
Je parle bien de la variable (lst) et non de la variable (lst_pref)

Messages : 2470

Inscription : 27 juil. 2016 19:38

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par U46406 » 21 oct. 2020 11:02

Si elle l'est modifiée, ça doit être ailleurs dans une autre portion du code (notion de variable globale, modifiable partout).
« Occupez-vous d’abord des choses qui sont à portée de main. Rangez votre chambre avant de sauver le monde. Ensuite, sauvez le monde. » (Ron Padgett, dans Comment devenir parfait) :mrgreen:

Messages : 187

Inscription : 09 août 2018 20:57

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par GrosGillouDu92 » 21 oct. 2020 11:42

En fait l'instruction

Code : Tout sélectionner

lst_pref = lst
ne crée pas une nouvelle liste indépendante de la première, mais simplement une nouvelle référence sur le même emplacement mémoire. Les modifications apportées via la première référence sont donc visible à travers la seconde.

Pour créer une nouvelle liste, tu peux utiliser le slicing

Code : Tout sélectionner

lst_pref = lst[:]

Messages : 0

Inscription : 20 oct. 2020 17:08

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par Charles Lambert » 21 oct. 2020 11:58

GrosGillouDu92 a écrit :
21 oct. 2020 11:42
En fait l'instruction

Code : Tout sélectionner

lst_pref = lst
ne crée pas une nouvelle liste indépendante de la première, mais simplement une nouvelle référence sur le même emplacement mémoire. Les modifications apportées via la première référence sont donc visible à travers la seconde.

Pour créer une nouvelle liste, tu peux utiliser le slicing

Code : Tout sélectionner

lst_pref = lst[:]
Merci beaucoup ça fonctionne !

Messages : 2470

Inscription : 27 juil. 2016 19:38

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par U46406 » 21 oct. 2020 12:07

GrosGillouDu92 a écrit :
21 oct. 2020 11:42
En fait l'instruction

Code : Tout sélectionner

lst_pref = lst
ne crée pas une nouvelle liste indépendante de la première, mais simplement une nouvelle référence sur le même emplacement mémoire. Les modifications apportées via la première référence sont donc visible à travers la seconde.

Pour créer une nouvelle liste, tu peux utiliser le slicing

Code : Tout sélectionner

lst_pref = lst[:]
Ah oui, merci pour l'explication très claire.

fakbill en avait d'ailleurs parlé pendant l'université d'été du forum Prépas :
viewtopic.php?f=10&t=74944&p=1007642#p1007642
fakbill a écrit :
11 août 2020 23:15
Ca dépend si le type est mutable ou pas.
En clair, si on peut modifier le contenu d'un objet après l'avoir créé alors a=b veut dire que a est un autre nom pour l'objet b. Si on modifie b alors a sera modifié.
Essaye avec des listes par exemple.
« Occupez-vous d’abord des choses qui sont à portée de main. Rangez votre chambre avant de sauver le monde. Ensuite, sauvez le monde. » (Ron Padgett, dans Comment devenir parfait) :mrgreen:

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: modification de ma variable Python

Message par fakbill » 26 oct. 2020 13:10

Je n'avais peut être pas été très clair à l'époque sur le sujet.
Python fonctionne avec des références.
Quand on écrit b=a, on dit juste "le machin qui s'appelle a s'appelle maintenant également b'. C'est tout.

a=[1,2,3]
id(a)
Out[2]: 215473728
b=a
id(b)
Out[4]: 215473728
aa=(1,2,3)
bb=aa
id(bb)
Out[7]: 178655872
id(aa)
Out[8]: 178655872

Si, après avoir fait b=a, on modifie a alors b est aussi modifé puisque 'b' c'est juste un autre nom pour a.
Si a n'est pas modifiable, par exemple si c'est un tuple, alors la question de 'modifier a ne se pose pas'. Par contre, si on fait ça;
a=(1,2)
b=a
a=(1)
alors b est toujours le nom d'un tuple qui contient (1,2) car a=(1) crée un nouvel objet .
Ce serait pariel avec un type modifiable:
a=(1,2)
b=a
a=[1]
Il faut bien faire la différence entre "modifier le contenu d'un conteneur" et "créer un nouveau conteneur".

Est ce plus clair??
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Répondre