2016-03-26 13 views
-3

Ich möchte die num_samples Variable verwenden, die ich in der Funktion make_averaged definiert habe. Wenn ich die Variable in fun_averaged verwende, sollte sie im Rahmen ihrer upper level Funktion suchen.Verwenden der Variablen der oberen Funktion

def make_averaged(fn, num_samples=1000): 
    def fun_averaged(*args) : 
     totalave = 0 
     savenum = num_samples 
     while not num_samples == 0: 
      totalave = fn(*args) + totalave 
      num_samples -= 1 
     avetagevalue = totalave/savenum 
     return avetagevalue 
    return fun_averaged 

Allerdings bekomme ich einen Fehler

while not samples1 == 0: 
UnboundLocalError: local variable 'samples1' referenced before assignment 
+0

Wäre hier nicht einfach eine Funktion einfacher? –

+1

Der Fehler scheint im angezeigten Code nicht aufgetreten zu sein. –

+1

Wo definierst du 'samples1'? – timgeb

Antwort

0

ändern:

while not num_samples == 0: 
    totalave = fn(*args) + totalave 
    num_samples -= 1 

in:

for _ in range(num_samples): 
    totalave = fn(*args) + totalave 

helfen sollte. Sie können auf num_samples von der äußeren Funktion zugreifen, aber Sie können ihm mit += nicht zuweisen.

ich nicht es für diesen Fall empfehlen, aber in Python 3 können Sie nonlocal zu tatsächlichen verwenden tun, was Sie beabsichtigen:

nonlocal num_samples 
while not num_samples == 0: 
    totalave = fn(*args) + totalave 
    num_samples -= 1 

Es funktioniert für den ersten Aufruf von fun_averaged. Aber beim nächsten Anruf fun_averaged wird der Wert num_samples0 sein.

+0

Ich muss äußere Funktion verwenden? Ich dachte "fun_averaged (* args)" wird den Wert von "num_samples" in "make_averaged" suchen, da es in "make_averaged" – Alex

+0

lebt. Es kann es sehen und verwenden, aber es kann ihm nicht zugewiesen werden. Sobald Sie '+ =' verwenden, gilt 'num_samples' als lokale Variable. –

+0

Vielen Dank! – Alex

Verwandte Themen