2016-02-26 60 views
0

我知道當我們將一個列表傳遞給一個python函數時,我們實際上將一個對象引用傳遞給列表。由於列表是可變的,將函數內的任何列表操作實際上會導致更改我們傳遞列表通過賦值來更改函數中列表的值

例:

def change_list(some_list): 
    some_list.remove('old list') 
    some_list.append('new list') 

sample = ['old list'] 
print(sample) # prints ['old list'] 
change_list(sample) # print ['new list'] 

當然,如果我們簡單地傳遞的副本列表中,也有叫change_list(sample[:])

這裏之後沒有改變的是,不會造成列表改變另外一種情況:

def change_list(some_list): 
    some_list = ['new list'] 

sample = ['old list'] 
change_list(sample) 
print(sample) # still prints ['old list'] 

好,所以這使我困惑,因爲我們將原始列表傳遞給函數而不是列表的副本,不應該python更改指針sample到現在指向['new list']

更重要的是奇怪的到,那就是下面的代碼將實際上會導致sample指向['new list']

def change_list(some_list): 
    some_list[:] = ['new list'] 

sample = ['old list'] 
change_list(sample) 
print(sample) # now prints ['new list'] 

什麼特別之處[:]符號在上面的代碼在python的內存模型方面。我的推測是some_list[:]是我們通過的名單的副本,但現在sample指向副本?

回答

0

首先,使用some_list = ['new list']只是讓some_list指向別的東西。它不會改變該內存位置處的內容。它不會影響過去用於指代的內容。至於[:],當你說some_list[:] = ...時,你實際上正在爲some_list.__setitem__(slice(0, None), ...)做一個快捷方式。這與設置some_list[4]相同,只是規模較大。