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

Federico Fissore federico a fissore.org
Dom 11 Feb 2024 18:12:18 CET


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



Maggiori informazioni sulla lista Python