Heim > Backend-Entwicklung > Python-Tutorial > Warum scheint Pythons Standardargumentveränderbarkeit das Prinzip des geringsten Erstaunens zu verletzen?

Warum scheint Pythons Standardargumentveränderbarkeit das Prinzip des geringsten Erstaunens zu verletzen?

Patricia Arquette
Freigeben: 2024-12-31 18:14:09
Original
924 Leute haben es durchsucht

Why Does Python's Default Argument Mutability Seem to Violate the Principle of Least Astonishment?

Standardargumentveränderlichkeit und das Prinzip des geringsten Erstaunens

Die Python-Community hat sich lange mit dem Prinzip des „geringsten Erstaunens“ auseinandergesetzt, das darauf abzielt Designmerkmale, die intuitiv sind und den Erwartungen entsprechen. Die Veränderlichkeit von Standardargumenten stellt jedoch eine rätselhafte Abweichung von diesem Prinzip dar.

Betrachten Sie die folgende Funktion:

def foo(a=[]):
    a.append(5)
    return a
Nach dem Login kopieren

Python-Neulinge könnten davon ausgehen, dass der Aufruf dieser Funktion ohne Parameter stets eine Liste ergeben würde mit nur einem Element: [5]. Das tatsächliche Verhalten ist jedoch weitaus eigenartiger:

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
Nach dem Login kopieren

Dieses Verhalten wurde von einigen kritisiert, die es als „dramatischen Konstruktionsfehler“ betrachten. Dahinter steckt jedoch eine logische Erklärung.

Funktionen in Python sind erstklassige Objekte, das heißt, sie können wie jeder andere Typ manipuliert und Variablen zugewiesen werden. Wenn eine Def-Anweisung ausgeführt wird, wird ein Funktionsobjekt erstellt. Dieses Objekt enthält nicht nur den Code der Funktion, sondern auch ihre Standardargumente, die als Attribute gespeichert werden.

Standardmäßig werden Standardargumente zum Zeitpunkt der Funktionsdefinition und nicht zum Zeitpunkt des Funktionsaufrufs ausgewertet. Dies bedeutet, dass sich der Status der Standardargumente während der Programmausführung ändern kann, was zu dem beobachteten Verhalten in der Funktion foo führt.

Diese Entwurfsentscheidung ergibt sich aus der Notwendigkeit, die Konsistenz aufrechtzuerhalten. Wenn Standardargumente zum Zeitpunkt des Funktionsaufrufs ausgewertet würden, würde die Def-Zeile zu einer Hybridanweisung werden, bei der ein Teil der Bindung sowohl bei der Definition als auch beim Aufruf erfolgen würde. Dieser Ansatz würde zu zusätzlicher Komplexität und potenzieller Verwirrung führen.

Wie der Effbot feststellte, ist dieses Verhalten nicht ohne praktische Anwendungen. Betrachten Sie beispielsweise den folgenden Code:

def a():
    print("a executed")
    return []

def b(x=a()):
    x.append(5)
    print(x)

a executed
>>> b()
[5]
>>> b()
[5, 5]
Nach dem Login kopieren

Hier wird der Standardwert von x zum Zeitpunkt der Funktionsdefinition ausgewertet, um sicherzustellen, dass a() nur einmal aufgerufen wird, unabhängig davon, wie oft b() aufgerufen wird aufgerufen.

Zusammenfassend lässt sich sagen, dass die Veränderlichkeit von Standardargumenten in Python eine bewusste Entwurfsentscheidung ist, die der Konsistenz Priorität einräumt und mit dem Prinzip erstklassiger Funktionen übereinstimmt. Auch wenn es zunächst kontraintuitiv erscheinen mag, bietet es eine größere Kontrolle und Flexibilität bei der Funktionsimplementierung.

Das obige ist der detaillierte Inhalt vonWarum scheint Pythons Standardargumentveränderbarkeit das Prinzip des geringsten Erstaunens zu verletzen?. 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