Rückkehr Variablen in Funktionen von Python Funktioniert Nicht Richtig
Ich habe versucht, um eine variable in einer Funktion in einer Variablen zu, und verwenden Sie es außerhalb von Ihr:
test = 0
def testing():
test = 1
return test
testing()
print(test)
Aber wenn ich es laufen lasse, ist das Ergebnis 0. Wie könnte ich dieses problem beheben?
Ändern Sie den Namen der globalen Variablen
Es gibt 7 Stimmen, wie dieses schreiben auf eine Antwort, die richtig aussieht. Aber ich glaube nicht, dass jemand tatsächlich erklärt diese. Der eigentliche Fehler in deinem code (der einzige Grund, warum es nicht funktioniert), ist, dass, wenn Sie die Funktion aufrufen, Sie erfassen nicht die return-Wert. Dann drucken Sie ein original unverändert Globale variable. Get Kommentare über Umfang richtig sind. "test" innerhalb Ihrer Funktion im lokalen Bereich und ist eine Kopie, die nicht zu einer änderung des globalen "test" - variable außerhalb der Funktion.
Wenn Sie sind neu in Python, obwohl, Sie sollten google "mutiert versus nonmutating" und Lesen Beiträge auf Stack Overflow über das auch bei der Arbeit mit Listen und Holen Sie sich Verhalten unterscheidet sich von scheinbar ähnlichem code. Wenn Sie "test" als argument haben Sie immer noch zurück zu geben, und es einzufangen, damit es funktioniert. Aber dieses Verhalten ist unterschiedlich für die mutierenden Variablen wie Listen. Hoffe, Sie finden diese hilfreich, neben den code-fixes, die bereits durch andere zur Verfügung gestellt zu Ihrer Frage.
Hoppla - dies ist ein 3 Jahre Alter Beitrag. Ich halt schrieb, dass bis zur Vollständigkeit für jeden, der stößt auf diesen thread, während der Suche um ein problem zu lösen.
test
zu g_test
und du wirst verstehen. Sie sind zwei völlig verschiedene Variablen, und mit den gleichen Namen, Sie sind einfach nur verwirrend sich.Es gibt 7 Stimmen, wie dieses schreiben auf eine Antwort, die richtig aussieht. Aber ich glaube nicht, dass jemand tatsächlich erklärt diese. Der eigentliche Fehler in deinem code (der einzige Grund, warum es nicht funktioniert), ist, dass, wenn Sie die Funktion aufrufen, Sie erfassen nicht die return-Wert. Dann drucken Sie ein original unverändert Globale variable. Get Kommentare über Umfang richtig sind. "test" innerhalb Ihrer Funktion im lokalen Bereich und ist eine Kopie, die nicht zu einer änderung des globalen "test" - variable außerhalb der Funktion.
Wenn Sie sind neu in Python, obwohl, Sie sollten google "mutiert versus nonmutating" und Lesen Beiträge auf Stack Overflow über das auch bei der Arbeit mit Listen und Holen Sie sich Verhalten unterscheidet sich von scheinbar ähnlichem code. Wenn Sie "test" als argument haben Sie immer noch zurück zu geben, und es einzufangen, damit es funktioniert. Aber dieses Verhalten ist unterschiedlich für die mutierenden Variablen wie Listen. Hoffe, Sie finden diese hilfreich, neben den code-fixes, die bereits durch andere zur Verfügung gestellt zu Ihrer Frage.
Hoppla - dies ist ein 3 Jahre Alter Beitrag. Ich halt schrieb, dass bis zur Vollständigkeit für jeden, der stößt auf diesen thread, während der Suche um ein problem zu lösen.
InformationsquelleAutor user2399308 | 2013-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie versauen ein bisschen die Bereiche und/oder Zuordnung. Versuchen Sie dies:
Erklärung: Die
test
innentesting
anderentest
innerhalb des Moduls. Ordnen Sie es auf Modul-Ebene, um das erwartete Ergebnis.InformationsquelleAutor Hyperboreus
Weil Sie erklären
test
in der Funktion, es ist keine Globale variable, daher können Sie nicht den Zugriff auf die variabletest
Sie erstellt haben in die Funktion außerhalb der it, wie Sie verschiedene BereicheWenn Sie wollen
return test
auf eine variable, die Sie haben zu tunOder, Sie können auch hinzufügen einer
global
Aussage:Durch die Art und Weise, wenn Sie eine bedingte Anweisung, die Sie nicht brauchen, sind die Klammern um die
1==1
:).@Hyperboreus :).
InformationsquelleAutor TerryA
Innerhalb der Funktion
testing()
, erstellen Sie eine neue variabletest
, nicht unter Bezugnahme auf das eine, das bereits vorhanden ist. Wenn Sie das tun wollen, sollten Sie eineglobal
- Anweisung in die Spitze, in:InformationsquelleAutor Eli Rose
Ihre
test
variable innerhalb der Funktion nicht haben einen globalen Gültigkeitsbereich. Also, wenn Sie wollen speichern den Rückgabewert in einer Variablen und Ausgabe, die es nach dass Sie tun können, so etwas wie dieses:InformationsquelleAutor Amal Murali
TLDR:
return
Wert muss zugeordnet etwas an der call-site.Funktionen in Python haben einen eigenen Bereich. Es wird auf die Eingabe (Berufung) die Funktion und zerstört, wenn Sie es verlassen. Zuordnung zu einem Namen innerhalb eines Bereichs macht, die lokalen Namen in diesem Umfang - wodurch es zerstört werden, zusammen mit dem Bereich.
Insbesondere, Namen in einem inneren scope kann "shadow" Namen aus einem äußeren Gültigkeitsbereich. Während der name
test
existiert in beidentesting
und der äußere Rahmen, es bezieht sich nicht auf die gleiche Sache. Dies hat zwei wichtige Implikationen:test
berührt nicht die äußerentest
.testing
, die inneretest
ist zerstört und nur die äußerentest
bleibt.Dies ist, warum ruft
testing()
nicht den gewünschten Effekt haben: es ist nie ändert, die äußerentest
übergebenprint
.Die
return
- Anweisung definiert den Wert, der zurückgegeben wird, durch den Aufruf einer Funktion. Es tut nicht den Namen, nur den Wert hinwies.Den Wert von einer Funktion zurückgegeben wird, ist wie jede andere Wert - sei es von einem literal, lookup, oder andere. Am wichtigsten ist, ist der Wert nicht beibehalten werden, es sei denn, Sie ordnen Sie einen Namen ein, oder verwenden Sie es direkt.
So, um wieder etwas von einer Funktion, für spätere Verwendung, müssen Sie das Ergebnis speichern einen Namen. Sie können dann mit diesen Namen in einer späteren Aussage. Ein minimal-Beispiel für deinen Fall sieht wie folgt aus:
Nachtrag: Es ist möglich, für eine Funktion zu ändern mit Umfang. Aber Namen müssen dann explizit deklariert werden wie Wesen von einem fremden Rahmen.
Den
nichtlokale
undglobal
keywords erlaubt das anpassen von Namen aus den äußeren Bereichen. Einnonlocal
heißt es in dem am besten passenden Funktionsumfang. Einglobal
ist der name des Moduls Umfang, unabhängig von irgendwelchen Funktionen, die in-zwischen.Beachten Sie, dass die änderung von äußeren Namen ist oft das Zeichen einer anti-Muster-ganz besonders für
global
s alsnonlocal
s. Über kleine Skripte, wird es schwierig, zu verfolgen, was den Zugriff auf und ändern vonglobal
s. Oft ist es sinnvoller, die Verwendung von Klassen oder Generatoren zu halten Zustand.Kann eine Funktion immer Lesen Namen von seinem enthaltenden Bereich, sofern es nie schreibt den gleichen Namen. Solche Verschlüsse sind sehr einfach zu erstellen, und der Mangel an Veränderung macht Ihnen einfacher, Sie zu verfolgen. Beachten Sie, dass die änderung einen Namen überall in einer Funktion macht es lokale, es sei denn, erklärt
global
odernonlocal
:InformationsquelleAutor MisterMiyagi