2016-09-14 2 views
0
def make_accumulator(init): 
    def accumulate(part): 
     init = init + part 
     return init 
    return accumulate 

A = make_accumulator(1) 
print A(2) 

gibt mir: -Unbound Lokale Fehler beim Zuweisen von Arg Funktion

Traceback (most recent call last): 
    File "make-accumulator.py", line 8, in <module> 
    print A(2) 
    File "make-accumulator.py", line 3, in accumulate 
    init = init + part 
UnboundLocalError: local variable 'init' referenced before assignment 

Warum ist init nicht sichtbar im Inneren ansammeln?

+0

wo Sie init initialisiert hat ... wenn Interpreter will init = init + Teil tun, sollte es vor initialisiert wissen init .. –

+0

einen Konstruktor verwenden, um festgelegt der init-Wert ... 'def make_accumulator (selbst, init): def __init __ (selbst, init): self.init = init' –

+1

@ lokesh1729 Sie übergeben ihren Wert an' make_accumulator', es ist eine Closure-Variable. Wenn sie nur "init + part" zurückgeben, wird es gut funktionieren. –

Antwort

1

Das liegt daran, während die innere Funktion Parsen, wenn Python die Zuordnung sieht init = init + part es init denkt, ist eine lokale Variable und es wird nur für sie in lokalem Bereich aussehen, wenn die Funktion tatsächlich aufgerufen wird.

Um es zu beheben, um accumulate mit Standardwert von initinit als Argument hinzu:

def make_accumulator(init): 
    def accumulate(part, init=init): 
     init = init + part 
     return init 
    return accumulate 

lesen: Why am I getting an UnboundLocalError when the variable has a value?

1
>>> def make_accumulator(init): 
...  def accumulate(part): 
...   return init + part 
...  return accumulate 
... 
>>> make_accumulator(1) 
<function accumulate at 0x7fe3ec398938> 
>>> A(2) 
3 

Da Sie init innen erklären akkumulieren, interpretiert Python es als lokal und daher vor der Zuweisung referenziert. (Beachten Sie, dass ich den init = Teil entfernt habe).

Ich bin definitiv kein Experte, aber habe den Hinweis aus diesen Beiträgen: Here und Here.

ich denke, jemand es besser erklären könnte ...

Verwandte Themen