<!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>