Dies liegt daran, dass die Kompilierung in Python durch Ausführen des beschreibenden Codes ausgeführt wird.
Wenn einer sagte
def f(x = {}):
....
es wäre ziemlich klar, dass Sie jedes Mal ein neues Array wollten.
Aber was ist, wenn ich sage:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Hier würde ich vermuten, dass ich Dinge in verschiedenen Listen erstellen und einen einzigen globalen Sammelbegriff haben möchte, wenn ich keine Liste spezifiziere.
Aber wie würde der Compiler das erraten? Warum also versuchen? Wir könnten uns darauf verlassen, ob dies benannt wurde oder nicht, und es könnte manchmal helfen, aber in Wirklichkeit würde es nur raten. Gleichzeitig gibt es einen guten Grund, es nicht zu versuchen - Konsistenz.
So wie es ist, führt Python nur den Code aus. Der Variablen list_of_all ist bereits ein Objekt zugewiesen, sodass dieses Objekt als Referenz in den Code übergeben wird, der standardmäßig x enthält, so wie ein Aufruf einer Funktion eine Referenz auf ein lokales Objekt erhalten würde, das hier genannt wird.
Wenn wir den unbenannten vom benannten Fall unterscheiden wollten, würde dies bedeuten, dass der Code bei der Kompilierung die Zuweisung auf eine wesentlich andere Weise ausführt als zur Laufzeit. Also machen wir den Sonderfall nicht.