Closed Lisa-Baget closed 5 years ago
Ah Ah! Un truc sur lequel beaucoup de mes etudiants se plantent!!!
Tu as un code qui fait quelque chose comme ça:
sauv = [1]
def foo(param):
param[0] = 2
foo(sauv)
Au debut, sauv
pointe sur une liste (sa valeur n'est pas la liste, mais un pointeur sur la liste ) qui contient a.
Quand j'execute foo(sauv)
, je cree pendant l'execution de la fonction un nouveau nom de variable, param
, qui contient la valeur de sauv
, c'est a dire un pointeur sur la liste. J'ai donc deux pointeurs sur une meme liste (celui de sauv
, variable globale, et celui de param
variable locale à a fonction). Maintenant, dans la fonction, en faisant param[0] = 2
, tu remplaces le premier element de la liste pointee par param
par 2. Comme c'est la meme liste pointee par `sauv
, c'est aussi modifié pour sauv
. A la fin de l'execution, la variable sauv
contient un pointeur sur la meme liste, qui est devenue [2]
.
Mais si tu veux écrire:
def foo(param):
param = [2]
Ce n'est plus la meme chose qui se passe. Dans l'execution, je dis: la valeur de param
est un pointeur sur une nouvelle liste [2]
. Ca ne change pas la valeur de sauv
qui est un pointeur sur l'ancienne liste [1]
. Et a la fin de l'execution, sauv
n'a pas changé. C'est pour ça que tu dis que ça ne fait plus la sauvegarde.
Mais si tu veux quand même écrire le code en une ligne, tu peu écrire (avec ton exemple):
sauvegarde[0:3] = [True, instruction, canal]
qui dit de remplacer les elements de la liste pointee par sauvegarde entre les positions 0 (inclus) et 3 (exclus) par ceux de la liste [True, instruction, canal]
et ça fera bien ce que tu veux.
Merci j'ai compris
Dans le fichier lecturemidi.py quand je remplace
par
ca marche plus! Apparemment il fait plus la sauvegarde :(