[Python] Questo, da Python, non me lo sarei mai aspettato

Federico Fissore federico a fissore.org
Lun 12 Feb 2024 08:47:27 CET


Ciao

no, l'ultima funzione sta rivalorizzando `par` ogni volta. Cambiala così e riesegui

def prova(par=['pippo']):
    if par == ['pippo']:
        print("cambiata")
        par = ['pluto']
    print(par)

ciao

federico

 ---- On Mon, 12 Feb 2024 00:09:55 +0100  Daniele Zambelli  wrote --- 
 > Mi pare di avere capito, ma continua a risultarmi strano questo comportamento:
 > 
 > 
 > def prova(par='pippo'):
 >     print(par)
 > 
 > prova('pluto')  # pluto
 > prova()         # pippo
 > 
 > def prova(par=['pippo']):
 >     print(par)
 > 
 > prova(['pluto'])    # ['pluto']
 > prova()             # ['pippo']
 > 
 > def prova(par=['pippo']):
 >     if par == ['pippo']:
 >         par = ['pluto']
 >     print(par)
 > 
 > prova()             # ['pluto']
 > prova()             # ['pluto']
 > 
 > Se il valore della variabile viene cambiata al momento della chiamata
 > della funzione, il valore di default rimane, se viene cambiata dalla
 > funzione stessa il valore di default cambia in tutte le chiamate
 > successive.
 > 
 > Grazie, ciao.
 > 
 > Il giorno dom 11 feb 2024 alle ore 18:12 Federico Fissore
 > federico a fissore.org> ha scritto:
 > >
 > > Ciao
 > >
 > > Result é locale alla funzione ma il suo valore di default no: quel [] è una lista definita a livello di funzione, quindi definita una volta e condivisa da ogni invocazione.
 > > Se vuoi evitare sorprese, usa none come valore di default, e nella funzione metti
 > > If result is none:
 > >    result = []
 > >
 > > Ciao
 > >
 > > Federico
 > >
 > >
 > >
 > > > On 11 Feb 2024, at 16:32, Daniele Zambelli daniele.zambelli a gmail.com> wrote:
 > > > Stavo studiando degli algoritmi per produrre la lista delle
 > > > permutazioni di una sequenza, ho modificato una funzione che ho
 > > > trovato su stackoverflow e mi sono imbattuto in un comportamento molto
 > > > strano (per me).
 > > > Lo script è questo:
 > > >
 > > > def permutazioni1(head, tail='', result=[]):
 > > >    if len(head) == 0:
 > > >        result.append(tail)
 > > >    else:
 > > >        for i in range(len(head)):
 > > >            permutazioni1(head[:i] + head[i+1:], tail + head[i])
 > > >        else:
 > > >          return(result)
 > > >
 > > > print(permutazioni1("abc"))
 > > >
 > > > print('---------------------')
 > > >
 > > > print(permutazioni1("def"))
 > > >
 > > > Io mi aspettavo che il parametro "result" fosse locale alla funzione
 > > > "permutazioni1" e che non mantenesse il suo contenuto tra una chiamata
 > > > e l'altra della funzione il risultato dello script è:
 > > >
 > > > ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
 > > > ---------------------
 > > > ['abc', 'acb', 'bac', 'bca', 'cab', 'cba', 'def', 'dfe', 'edf', 'efd',
 > > > 'fde', 'fed']
 > > >
 > > > Probabilmente non è il modo corretto per ottenere la lista delle
 > > > permutazioni, ma qualcuno sa spiegarmi perché si comporta così e come
 > > > eventualmente correggerlo?
 > > >
 > > > Grazie, da una domenica uggiosa.
 > > >
 > > > --
 > > >
 > > > Daniele
 > > >
 > > > www.matematicadolce.eu
 > > >
 > > > Perché la scuola,
 > > > invece di essere un luogo dove ci si allena a imparare,
 > > > è un luogo dove si fa finta di sapere?
 > > > _______________________________________________
 > > > Python mailing list
 > > > Python a lists.python.it
 > > > https://lists.python.it/mailman/listinfo/python
 > >
 > 
 > 
 > -- 
 > 
 > Daniele
 > 
 > www.matematicadolce.eu
 > 
 > Perché la scuola,
 > invece di essere un luogo dove ci si allena a imparare,
 > è un luogo dove si fa finta di sapere?
 > _______________________________________________
 > Python mailing list
 > Python a lists.python.it
 > https://lists.python.it/mailman/listinfo/python
 > 


Maggiori informazioni sulla lista Python