Succede perché la compilazione in Python viene eseguita eseguendo il codice descrittivo.
Se uno ha detto
def f(x = {}):
....
sarebbe abbastanza chiaro che volevi un nuovo array ogni volta.
Ma cosa succede se dico:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Qui indovinerei che voglio creare cose in vari elenchi, e avere un unico catch-all globale quando non specificherò una lista.
Ma come lo indovinerebbe il compilatore? Allora perché provare? Potremmo fare affidamento sul fatto che questo sia stato nominato o meno, e potrebbe essere utile a volte, ma in realtà sarebbe solo una supposizione. Allo stesso tempo, c'è una buona ragione per non provare - coerenza.
Come è, Python esegue il codice. Alla variabile list_of_all viene assegnato già un oggetto, in modo tale che l'oggetto sia passato per riferimento nel codice che imposta automaticamente x allo stesso modo in cui una chiamata a qualsiasi funzione otterrebbe un riferimento a un oggetto locale chiamato qui.
Se volessimo distinguere il nome senza nome dal caso nominato, ciò implicherebbe il codice alla compilazione che esegue l'assegnazione in un modo significativamente diverso da quello che viene eseguito in fase di esecuzione. Quindi non facciamo il caso speciale.