/ / Spezifisches Problem im Zusammenhang mit Variablenreferenzen - Python, Python-2.7, Funktion, Variablen, Referenz

Spezifisches Problem im Zusammenhang mit Variablenreferenzierung - Python, Python-2.7, Funktion, Variablen, Referenz

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 wenn global war für alle erforderlich global Referenzen, die Sie verwenden global die ganze Zeit. Sie müssten als deklarieren global jede Referenz auf eine eingebaute Funktion oder auf eine Komponente eines importierten Moduls. Diese Unordnung würde die Nützlichkeit der global 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
....