Heim > Backend-Entwicklung > Python-Tutorial > Warum erscheint Pythons veränderbares Standardargumentverhalten so überraschend?

Warum erscheint Pythons veränderbares Standardargumentverhalten so überraschend?

Susan Sarandon
Freigeben: 2024-12-24 08:46:20
Original
853 Leute haben es durchsucht

Why Does Python's Mutable Default Argument Behavior Seem So Surprising?

„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
Nach dem Login kopieren

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]
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage