modification de ma variable Python
modification de ma variable Python
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
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
Re: modification de ma variable Python
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 ?
Re: modification de ma variable Python
Logarithme_Neperien a écrit : ↑21 oct. 2020 08:45Ta 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)
Re: modification de ma variable Python
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)
Re: modification de ma variable Python
En fait l'instruction
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
Pour créer une nouvelle liste, tu peux utiliser le slicing
Code : Tout sélectionner
lst_pref = lst[:]
Re: modification de ma variable Python
Merci beaucoup ça fonctionne !GrosGillouDu92 a écrit : ↑21 oct. 2020 11:42En fait l'instructionne 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.Code : Tout sélectionner
lst_pref = lst
Pour créer une nouvelle liste, tu peux utiliser le slicingCode : Tout sélectionner
lst_pref = lst[:]
Re: modification de ma variable Python
Ah oui, merci pour l'explication très claire.GrosGillouDu92 a écrit : ↑21 oct. 2020 11:42En fait l'instructionne 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.Code : Tout sélectionner
lst_pref = lst
Pour créer une nouvelle liste, tu peux utiliser le slicingCode : Tout sélectionner
lst_pref = lst[:]
fakbill en avait d'ailleurs parlé pendant l'université d'été du forum Prépas :
viewtopic.php?f=10&t=74944&p=1007642#p1007642
« 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)
Re: modification de ma variable Python
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??
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é.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.