Nun möchte ich klarstellen, dass ich die Variable nicht einschließen möchte b
als Argument der Funktion g
. Gibt es einen anderen Weg, wie ich gehen könnte?diesen Code umschreiben, vorausgesetzt, dass g rekursiv aufgerufen wird? Selbst das Erwähnen von b = 0 und das Aufrufen als global scheint den Referenzzuweisungsfehler nicht zu verbessern.
global b
b = 0
def g(x):
if b < x:
for i in range(10):
if u == i:
b += 1
g(x) #g is called recursively
for u in range(20):
b = 5
g(7)
Antworten:
1 für die Antwort № 1# that is from MSeifert(voted is correct), @Chalid
b = 0
first = []
second = []
def g(x):
global b # So python knows you use the global variable!
first.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)
for u in range(20):
b = 5
g(7)
# my solution is without any global variable
# and the result matching the expectation
def g(x,b):
second.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x,b) #g is called recursively
b = 5
for u in range(20):
g(7,b)
print len(first), len(second)
print first
print second
40 40
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
1 für die Antwort № 2
global
wird verwendet, wenn Sie explizit a verwenden und aktualisieren möchten global
Variable. Also musst du verwenden global b
in Ihrer Funktion statt außerhalb:
b = 0
def g(x):
global b # So python knows you use the global variable!
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)
for u in range(20):
b = 5
g(7)
Weil du es benutzt b += 1
in deinem g
Funktion, die Sie deklarieren müssen b
wie global
. Ansonsten bekommst du eine UnboundLocalError
:
UnboundLocalError: Lokale Variable "b" vor der Zuweisung referenziert
Siehe auch die Python-FAQ:
Welche Regeln gelten für lokale und globale Variablen in Python?
In Python Variablen, auf die nur verwiesen wirdinnerhalb einer Funktion sind implizit global. Wenn einer Variablen irgendwo im Rumpf der Funktion ein Wert zugewiesen wird, wird davon ausgegangen, dass sie lokal ist, sofern sie nicht explizit als global deklariert ist.
Obwohl dies zunächst ein wenig überraschend ist, erklärt dies eine kurze Überlegung. Einerseits erforderlich
global
für zugewiesene Variablen bietet einen Balken gegen unbeabsichtigte Nebenwirkungen. Andererseits wennglobal
war für alle erforderlichglobal
Referenzen, die Sie verwendenglobal
die ganze Zeit. Sie müssten als deklarierenglobal
jede Referenz auf eine eingebaute Funktion oder auf eine Komponente eines importierten Moduls. Diese Unordnung würde die Nützlichkeit derglobal
Erklärung zur Identifizierung von Nebenwirkungen.
0 für die Antwort № 3
Es könnte die Haare der Menschen stehen lassen, aber Sie könnten hinzufügen b
als ein Attribut zu g
.
def g(x):
If g.b > x:
...
g.b = 5
....