<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
Ciao,<br>
quando crei una funzione con parametri di default in python,
funziona un po' come se l'avessi in realtà dichiarata così (*)<br>
<pre>var_0001 = []
def prova(cambia, par):
if par is None:
par = var_0001
if cambia:
par.append('pippo')
print("cambiata")
print(par)
</pre>
e l'interprete avesse trasformato le chiamate in <br>
<pre class="moz-quote-pre" wrap="">prova(False, None) # []
prova(True, None) # cambiata \n ['pippo']
prova(False, None) # ['pippo']
</pre>
<br>
<br>
In altre parole, ogni volta che entri nella funzione il parametro <i>par
</i>viene agganciato alla variabile <i>var_0001 </i>e quindi ogni
modifica al contenuto di <i>par </i>tocca la variabile. <br>
se invece di append metti <br>
<font face="monospace">par = ['pippo']<br>
</font>invece non modifichi <i>var_0001</i>, ma stai semplicemente
agganciando par a<i> ['pippo']</i><br>
La prossima volta par sarà riagganciato alla variabile originaria e
quindi avrai sempre<br>
<br>
<pre class="moz-quote-pre" wrap="">prova(False, None) # []
prova(True, None) # cambiata \n ['pippo']
prova(False, None) # []
</pre>
Ciao,<br>
Riccardo<br>
<div class="moz-cite-prefix">
<div id="rwhMsgHeader">
<hr id="rwhMsgHdrDivider"
style="border:0;border-top:1px solid #ffffff;padding:0;margin:10px 0 5px 0;width:100%;"></div>
</div>
(*) ovviamente l'interprete non lavora proprio così<br>
<br>
</body>
</html>