Warum nicht eine sub-Funktion, Erben Umfang in Python?
Ich verstehe nicht, warum Folgendes nicht funktioniert:
def foo( x ):
n = 1
summe = 0
def bar():
n -= 1
for i in range(0,10):
y = x+i+n
x += i
summe += y
print "{0} = {1} + {2} + {3}".format(y,x,i,n)
bar()
print "summe =", summe
return summe
Warum ist es, dass bar()
Erben nicht den Umfang der foo()
? Ist das ein C'ism, dass ich vergessen muss? Gibt es eine Möglichkeit, ich kann machen, dass die Arbeit?
- Welche version von Python benutzt du?
- Version 2.6.6. Ist dies behandelt in einer neueren version?
- Es kann nicht sein, eine C-ism - in C eine Funktion nicht haben "innere Funktionen".
- BTW, ich hoffe, es ist nur ein Beispiel. Es ist völlig sinnlos diese Funktion zu nutzen, anstatt nur das zu tun
n -= 1
wo es gebraucht wird... - Das ist nicht wahr. Dieser code gültig ist (stellen Sie sicher, dass Sie in
#include <stdio.h>
oben):int main() { char test_me[] = "this is a test\n"; void my_print(){ printf(test_me);} my_print(); return 0; }
GCC gibt eine Warnung über es, aber es funktioniert. - Und auch das war nicht wirklich der Punkt hier. Dies ist eine eher gekünstelt Beispiel Fragen zu Umfang.
- Hier es wird beschrieben, wie ein GCC-Erweiterung. In Standard-C ist es nicht gültig.
- Yup, ich muss zugeben, dass Sie korrekt sind. Ich entschuldige mich. Ich denke, ich hatte nur GCC zu lange-nicht, dass ich habe müssen für verschachtelte Funktionen in C, aber ich wusste, dass Sie möglich mit dem GCC.
Du musst angemeldet sein, um einen Kommentar abzugeben.
PEP 3104 bietet eine Erklärung und eine Lösung für dieses problem. Das Problem ist Python behandelt jede Zuordnung zu einem Namen als lokalen Deklaration von Variablen.
Gibt es ein paar workarounds für dieses problem, wenn Sie eine Python-version, ohne die nichtlokale Schlüsselwort. Ein hässlicher trick ist, um wickeln Sie Ihre Variablen in einer Liste:
Obwohl dieser trick funktioniert, ist es normalerweise besser, den code neu schreiben zu entfernen, die Notwendigkeit für nicht-lokale Zuordnungen.
for
Schleife mit ein paarelif
s für eine Art reset-Funktion. Ich habe einige lambdas das problem zu umgehen, aber Sie sind beschränkt in Ihrer Funktionalität.Ich tatsächlich festgestellt, dass diese Frage bei der Suche nach einer Lösung für ein etwas anderes problem. Lokale Variablen werden nicht vererbt sub ' s geerbt, aber es gibt nichts hindert Sie übergeben die variable an die innere Funktion und dann die Zuordnung der Ergebnisse auf die Rückkehr.
Dies ist zusätzlich zu den
nonlocal
Anweisung in PEP 3104. Es ist etwas weniger hässlich und macht das Auswendiglernen noch ein python-Schlüsselwort dabei weniger entscheidend.summe
zubar()
. Außerdem ist Ihrebar()
zurückNone
, und es ist nicht zu ändernsumme
, abern
.