


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
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]
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]
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!

Es gibt viele Methoden, um zwei Listen in Python zu verbinden: 1. Verwenden Sie Operatoren, die in großen Listen einfach, aber ineffizient sind; 2. Verwenden Sie die Erweiterungsmethode, die effizient ist, die ursprüngliche Liste jedoch ändert. 3.. Verwenden Sie den operator =, der sowohl effizient als auch lesbar ist; 4. Verwenden Sie die Funktion iterertools.chain, die Speichereffizient ist, aber zusätzlichen Import erfordert. 5. Verwenden Sie List Parsing, die elegant ist, aber zu komplex sein kann. Die Auswahlmethode sollte auf dem Codekontext und den Anforderungen basieren.

Es gibt viele Möglichkeiten, Python -Listen zusammenzuführen: 1. Verwenden von Operatoren, die einfach, aber nicht für große Listen effizient sind; 2. Verwenden Sie die Erweiterungsmethode, die effizient ist, die ursprüngliche Liste jedoch ändert. 3. Verwenden Sie iTertools.chain, das für große Datensätze geeignet ist. 4. Verwenden Sie * Operator, fusionieren Sie kleine bis mittelgroße Listen in einer Codezeile. 5. Verwenden Sie Numpy.concatenate, das für große Datensätze und Szenarien mit hohen Leistungsanforderungen geeignet ist. 6. Verwenden Sie die Append -Methode, die für kleine Listen geeignet ist, aber ineffizient ist. Bei der Auswahl einer Methode müssen Sie die Listengröße und die Anwendungsszenarien berücksichtigen.

CompiledLanguageOfferSpeedandSecurity, während interpretedLanguagesProvideaseofuseAnDportabilität.1) kompiledlanguageslikec areFasterandSecurebuthavelongerDevelopmentCyclesandplatformDependency.2) InterpretedLanguages -pythonareaToReAndoreAndorePortab

In Python wird eine für die Schleife verwendet, um iterable Objekte zu durchqueren, und eine WHHE -Schleife wird verwendet, um Operationen wiederholt durchzuführen, wenn die Bedingung erfüllt ist. 1) Beispiel für Schleifen: Überqueren Sie die Liste und drucken Sie die Elemente. 2) Während des Schleifens Beispiel: Erraten Sie das Zahlenspiel, bis Sie es richtig erraten. Mastering -Zyklusprinzipien und Optimierungstechniken können die Code -Effizienz und -zuverlässigkeit verbessern.

Um eine Liste in eine Zeichenfolge zu verkettet, ist die Verwendung der join () -Methode in Python die beste Wahl. 1) Verwenden Sie die monjoy () -Methode, um die Listelemente in eine Zeichenfolge wie "" .Join (my_list) zu verkettet. 2) Für eine Liste, die Zahlen enthält, konvertieren Sie die Karte (STR, Zahlen) in eine Zeichenfolge, bevor Sie verkettet werden. 3) Sie können Generatorausdrücke für komplexe Formatierung verwenden, wie z. 4) Verwenden Sie bei der Verarbeitung von Mischdatentypen MAP (STR, MIXED_LIST), um sicherzustellen, dass alle Elemente in Zeichenfolgen konvertiert werden können. 5) Verwenden Sie für große Listen '' .Join (large_li

Pythonusesahybridapproach, kombinierte CompilationTobyteCodeAnDinterpretation.1) codiscompiledtoplatform-unintenpendentBytecode.2) BytecodeIsinterpretedBythepythonvirtualMachine, EnhancingEfficiency und Portablabilität.

Die Keedifferzences -zwischen Pythons "für" und "während" Loopsare: 1) "für" LoopsareideAlForiteratingOvercesorknownowniterations, während 2) "LoopsarebetterForContiningUtilAconditionismethoutnredefineditInations.un

In Python können Sie Listen anschließen und doppelte Elemente mit einer Vielzahl von Methoden verwalten: 1) Verwenden von Operatoren oder erweitert (), um alle doppelten Elemente beizubehalten; 2) Konvertieren in Sets und kehren Sie dann zu Listen zurück, um alle doppelten Elemente zu entfernen. Die ursprüngliche Bestellung geht jedoch verloren. 3) Verwenden Sie Schleifen oder listen Sie Verständnisse auf, um Sätze zu kombinieren, um doppelte Elemente zu entfernen und die ursprüngliche Reihenfolge zu verwalten.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.
