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

A = make_accumulator(1) 
print A(2) 

給我: -非綁定本地錯誤時分配到功能精氨酸

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 

爲什麼是init不可見的內部積聚?

+0

你在哪裏初始化的init ...當翻譯想做的init =初始化+的一部分,它應該知道之前的init初始化.. –

+0

使用構造函數來設置初始值...'def make_accumulator(self,init):def __init __(self,init):self.init = init' –

+1

@ lokesh1729它們將值傳遞給'make_accumulator',它是一個閉包變量。如果他們只執行'返回init + part',它就可以正常工作。 –

回答

1

這是因爲在Python看到賦值時分析內部函數init = init + part它認爲init是一個局部變量,它只會在實際調用該函數時在本地範圍內查找它。

要修復它作爲一個參數添加initaccumulateinit默認值:

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

閱讀: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 

既然你聲明init內部積聚,巨蟒將其解釋作爲本地,因此在分配前引用。 (請注意,我刪除了init =部分)。

我絕對不是這方面的專家,但從這些帖子得到提示:HereHere

我想有人能更好地解釋它...

相關問題