2011-08-13 22 views
2
d1 = {"dog":"woof", "cat":"meow"} 
d2 = d1 
d2["dog"] = "bark" 
for i in d1: 
    print(i, d1[i]) 

dog bark 
cat meow 

什麼是做,所以最好的辦法:的Python:字典鏈接數據

dog woof 
cat meow 
+0

您還可以使用切片表示法。必須仔細檢查(在手機上),但在想要複製的項目之後使用[:]之類的東西。 – mikey

回答

6
d1 = {"dog":"woof", "cat":"meow"} 
d2 = d1.copy() # make a copy, not a reference to the same dictionary 
d2["dog"] = "bark" 
for i in d1: 
    print(i, d1[i]) 

# dog woof 
# cat meow 
1

Copy字典:

d2 = d1.copy() # instead of d2 = d1 
2

d1d2指向同一個對象內存並因此更改d2中的值將影響d1

d1 = {} 
d2 = d1 
print id(d1) == id(d2) 
# out: True 

使用字典類或複製模塊的複製方法。

d2 = d1.copy() 

from copy import copy 
d2 = copy(d1) 

如果您有存儲在詞典(即列表)可變對象,並希望theese複製,以及,你應該使用deepcopy的功能。

from copy import deepcopy 
d2 = deepcopy(d1) 
0

在你的情況,無論是d1d2是指同一個對象。使用copy.copy(d1)

  • 使用d1.copy()
    1. 使用dict(d1)
    2. 使用copy.deepcopy(d1)

    1,2,3將創建淺拷貝和4:您可以通過創建原始字典的副本將創建一個深拷貝

  • 0

    我想提出一個更好的方法來做到這一點。

    from collections import ChainMap 
    d1 = {"dog":"woof", "cat":"meow"} 
    d2 = ChainMap({}, d1) 
    d2["dog"] = "bark" 
    
    for i in d1: 
        print(i, d1[i]) 
    # dog woof 
    # cat meow 
    
    for i in d2: 
        print(i, d2[i]) 
    # dog bark 
    # cat meow 
    

    請閱讀ChainMap的參考:https://docs.python.org/3/library/collections.html#collections.ChainMap

    如果您使用python2,落實ChainMap,使用最少的代碼食譜:https://code.activestate.com/recipes/305268/

    +0

    有趣的是,你爲什麼認爲這種方式比字典更好? – SCD

    +0

    嗨SCD。因爲ChainMap是一本字典,它既不比詞典更好也不比詞典差。更確切地說,在抽象的下面,它是一個字典列表。 – datsuji

    +0

    大多數時候這是一個合適的選擇,因爲原來的字典可能是任何大小,並不會影響你。特別是如果你只更改數據中的幾個條目。 – datsuji