2014-02-15 41 views
2
def a(): 
    mem=['a'] 
    def b(): 
     mem=[]                          
     print(str(mem)) 
    return b 
a()() 

即使我不會在b函數中添加​​,爲什麼這段代碼仍然有效? 感謝您的幫助。爲什麼我不需要在這種情況下使用非本地?

+2

它不會,如果你希望'mem'在'a'範圍內被修改。 – roippi

+1

「工作」是什麼意思?你得到了什麼輸出,哪些輸出會算作「不工作」? – geoffspear

+0

我試圖改變從一個函數的內存,我想我應該得到的錯誤,我不能分配給內存因爲它沒有被定義 –

回答

2

您已將空列表對象分配到memb,因此它已被定義。打印時查找成功。

請注意,mem本地名稱b; mem本地a完全不受影響,這兩個名稱完全分開。

如果您預計amem改變,你要麼在b標記mem非本地的,或者你能避免通過直接改變mem對象分配:

def a(): 
    mem = ['a'] 
    def b(): 
     mem[:] = [] 
     print(str(mem)) 
    return b 
a()() 

這裏的名字mem是未分配給;相反裏面的mem列表被改變。因爲b中沒有任務名稱mem,所以它不是本地的。

這是可行的,因爲列表對象本身是可變的;您可以與對象交互並更改內容。

+0

我試圖改變'一個函數'的內存 –

+1

@MikeL:那麼你需要將它標記爲'nonlocal'。或直接更改列表對象,而不是在'b'中重新綁定'mem'。 –

+0

是否有任何函數可以告訴我這些列表所在的位置?例如:print(func(mem)) - > b.mem(在b函數中沒有非本地) –

相關問題