Heim >Backend-Entwicklung >Python-Tutorial >Warum erscheint Pythons veränderbares Standardargumentverhalten so überraschend?
„Least Astonishment“ und das veränderliche Standardargument
Pythons überraschendes Verhalten mit veränderlichen Standardargumenten hat unzählige Entwickler verwirrt. Bedenken Sie Folgendes:
def foo(a=[]): a.append(5) return a
Intuitiv könnte man erwarten, dass diese Funktion immer eine Liste zurückgibt, die nur [5] enthält, wenn sie ohne Parameter aufgerufen wird. Diese Annahme wird jedoch durch die tatsächliche Ausgabe zunichte gemacht:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
Also, was ist los?
Der Schlüssel liegt in den erstklassigen Funktionsobjekten von Python. Wenn eine Funktion definiert ist, wird sie sofort ausgewertet, einschließlich der Auswertung der Standardargumente. Im Fall von foo wird der Standardwert für a als leere Liste ausgewertet. Diese Liste wird jedoch im Funktionsobjekt selbst gespeichert, sodass sie für nachfolgende Aufrufe veränderbar ist.
Anders als in Sprachen wie C sind Funktionsparameter in Python keine statischen Variablen, die zur Kompilierungszeit ausgewertet werden. Stattdessen sind sie an Objekte gebunden, die sich im Laufe der Zeit ändern können. Dieses Konzept der „Mitgliedsdaten“ in Funktionsobjekten erklärt das erstaunliche Verhalten, das wir bei veränderlichen Standardargumenten beobachten.
Wie der Effbot in „Default Parameter Values in Python“ feststellt, ist dieses Verhalten logisch und konsistent mit der Funktionsweise anderer Objekte :
"Jedes Objekt kann seinen Zustand von einem Aufruf zum anderen ändern. Warum sollten Funktionen unterschiedlich sein?"
Daher kann dieses Verhalten zwar auftreten Zunächst überraschend, folgt es letztendlich dem Prinzip des „geringsten Erstaunens“, indem es sich an der objektorientierten Natur von Python und den Erwartungen an veränderliches Objektverhalten orientiert.
Das obige ist der detaillierte Inhalt vonWarum erscheint Pythons veränderbares Standardargumentverhalten so überraschend?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!