Heim > Backend-Entwicklung > Python-Tutorial > Warum geben meine Funktionen in einer Python-Schleife alle denselben Wert zurück?

Warum geben meine Funktionen in einer Python-Schleife alle denselben Wert zurück?

Susan Sarandon
Freigeben: 2024-12-20 16:22:10
Original
748 Leute haben es durchsucht

Why Do My Functions in a Python Loop All Return the Same Value?

Late Binding beim Erstellen von Funktionen in Schleifen oder Comprehensions verstehen

Beim Versuch, Funktionen innerhalb einer Schleife zu erstellen, kann es vorkommen, dass Alle Funktionen geben denselben Wert zurück, obwohl sie unterschiedliche Ausgaben erwarten. Dieses Verhalten tritt aufgrund der späten Bindung auf, bei der der Wert einer Variablen zum Zeitpunkt der Ausführung aufgelöst wird.

Pythons späte Bindung

In Python werden Funktionen und Lambdas durch Standardbindungsvariablen zum Zeitpunkt der Ausführung. Dies bedeutet, dass alle darin verwendeten Variablen beim Aufruf der Funktion nachgeschlagen werden. In Ihrer Schleife wird der Schleifeniterator i später aufgelöst und verweist zu diesem Zeitpunkt auf den Endwert von i nach der Schleife.

Zum Beispiel im folgenden Codeausschnitt:

functions = []

for i in range(3):
    def f():
       return i

    functions.append(f)
Nach dem Login kopieren

Alle Funktionen in der Funktionsliste verweisen auf denselben Wert von i, der nach Abschluss der Schleife 2 ist.

Früh erzwingen Bindung

Um dieses Problem zu beheben, müssen Sie eine frühe Bindung erzwingen, die sicherstellt, dass der Wert von i zum Zeitpunkt der Funktionsdefinition gebunden ist. Eine Möglichkeit, dies zu tun, besteht darin, einen Standardwert für das Argument zu verwenden, wie unten gezeigt:

functions = []

for i in range(3):
    
    def f(i=i):
       return i
    
    functions.append(f)
Nach dem Login kopieren

Durch die Bereitstellung eines Standardwerts für das i-Argument wird eine frühe Bindung erzwungen. Der Wert von i, der an die f-Funktion übergeben wird, wird aufgelöst, wenn die Funktion definiert wird, nicht wenn sie ausgeführt wird.

Verwendung einer Funktionsfabrik

Ein anderer Ansatz ist eine Funktionsfabrik zu verwenden, die Funktionen mit den gewünschten Bindungen erstellt. Dazu gehört das Erstellen einer zusätzlichen Funktion, die die Variable, die Sie binden möchten, übernimmt und eine verschachtelte Funktion mit der früh gebundenen Variablen zurückgibt:

def make_f(i):

    def f():
        return i
        
    return f
Nach dem Login kopieren

In Ihrer Schleife können Sie dann f = make_f(i) zum Erstellen verwenden funktioniert mit den entsprechenden frühen Bindungen.

Das obige ist der detaillierte Inhalt vonWarum geben meine Funktionen in einer Python-Schleife alle denselben Wert zurück?. 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