modification de ma variable Python

Répondre

Messages : 0

Enregistré le : 20 oct. 2020 17:08

Classe : MPSI

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

Enregistré le : 13 janv. 2020 07:47

Classe : PSI

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

Enregistré le : 20 oct. 2020 17:08

Classe : MPSI

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 : 142

Enregistré le : 27 juil. 2016 19:38

Classe : shadow CCO nobo CMT

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 : 9

Enregistré le : 09 août 2018 20:57

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[:]
Parent

Messages : 0

Enregistré le : 20 oct. 2020 17:08

Classe : MPSI

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 : 142

Enregistré le : 27 juil. 2016 19:38

Classe : shadow CCO nobo CMT

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 : 9664

Enregistré le : 30 juil. 2008 16:59

Classe : Dr.-Ing

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