2017-04-22 55 views
1

代碼簡述:函數返回字典覆蓋所有字典

主代碼首先製作一個空白的字典,它傳遞給我的函數。該函數記錄每個數字的數量並更新隨後返回的字典。然而,當函數執行時,它會將輸入的'blank_dictionary'覆蓋爲它返回的字典('new_dictionary')。爲什麼會發生?我希望主代碼中的'字典'始終保持空白,以便可以重複使用。

def index_list(lst, blank_dictionary): 
    new_dictionary = blank_dictionary 
    for i in lst: 
     new_dictionary[i] += 1 
    return new_dictionary 

number = 1 
maximum = 3 
numbers = range(1,maximum+1) 

dictionary = {} 
for i in numbers: 
    dictionary[i] = 0 

print ('original blank dictionary', dictionary) 
new_dictionary = index_list([3,3,3],dictionary) 
print ('new dictionary which indexed the list', new_dictionary) 
print ('should still be blank, but isnt', dictionary) 

輸出:

original blank dictionary {1: 0, 2: 0, 3: 0} 
new dictionary which indexed the list {1: 0, 2: 0, 3: 3} 
should still be blank, but isnt {1: 0, 2: 0, 3: 3} 

非常感謝

+2

[如何複製字典並僅編輯副本]的可能副本(http://stackoverflow.com/questions/2465921/how-to-copy-a-dictionary-and-only-edit-the-copy ) –

+1

是的,謝謝@PierPaolo。 – PurpleDiane

+0

[閱讀Python中如何使用變量和賦值。](https://nedbatchelder.com/text/names.html) – user2357112

回答

3

要設置new_dictionary參考blank_dictionary。將該行更改爲new_dictionary = dict(blank_dictionary),您會沒事的。使用dict()構造函數將會產生一個新的new_dictionary,所以blank_dictionary不會被修改。

您可能想要調查collections模塊中的defaultdict。如果您只需計算每個元素出現的次數,請考慮collections.counter

+0

啊我看到了,所以它就像C中的指針,如果沒有使用dict() ?非常感謝這讓我瘋狂。 – Nishalc

1

看一看here

您顯示在你的代碼發生。

1

此行爲不限於字典。在Python中,只要您將可變對象傳遞給函數,該函數就會對原始對象進行操作,而不是副本。對於元組和字符串等不可變對象,這不是真的。

但是在這種情況下,沒有理由首先將空白字典傳遞給函數。該函數可以創建一個新的字典並返回它。