[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