2016-01-27 74 views
0
>>> docsite = {'text1':1, 'text2':1} 

>>> doc = {  
    'field1': docsite, 
    'field2': docsite 
} 

>>> doc['field2']['text1'] += 2 

在此之後,當我打印的文檔變量,我得到Python的字典中

>>> doc 
{'field2': {'text2': 1, 'text1': 3}, 'field1': {'text2': 1, 'text1': 3}} 

我只FIELD2變化值。不知何故,field1中的值也正在更新。

問:

  1. 爲什麼?

  2. 如何解決?

回答

3

docsite變量是參考到dictionnary,因此,在不同的位置存儲它(例如與另一個詞典中的不同鍵相關聯)將使它們在內存中共享相同的詞典。

要解決這個問題,你可能想要做你的字典的copy

doc = {'field1': docsite, 'field2': docsite.copy()} 

需要注意的是,如果在docsite你有(,list其他dict等),其他對象的引用,那麼你可能有使用一個deepcopy

import copy 
d2 = copy.deepcopy(docsite) 
3

Dict's mutable python中的對象。當您將dict分配給其他變量時,它將被分配,引用,導致您所描述的問題。

因此,在您的情況下,doc dict(field1,field2)中的鍵值都指向相同的變量(docsite)。這就是你有這樣的行爲。

若要解決該問題,請在將其分配給doc鍵之前使用字典複製方法。

docsite = {'text1':1, "text2":1} 

doc = {  
"field1": docsite.copy(), 
"field2": docsite.copy() 
} 

兩種類型的副本在python,deepcopy的和淺拷貝(見that SO answer瞭解它們之間的差異)的。

以上示例僅爲docsite的副本。然而,你可以通過下面的代碼使deepcopy的

import copy 


docsite = {'text1':1, "text2":1} 

doc = {  
"field1": copy.deepcopy(docsite), 
"field2": copy.deepcopy(docsite) 
} 

Immutable vs Mutable types這是個好問題,SO來發現蟒蛇該主題...

2
import copy 
doc = {  
"field1":docsite, 
"field2":copy.deepcopy(docsite) 
} 

兩個鍵在文檔映射到同一個對象,當您更改一個鍵的值時,您正在更改docsite對象,另一個鍵也會映射到同一個對象。

2

因爲doc字典中的值引用相同的字典對象。

來解決,通過字典的副本,以便值是指不同的字典對象:

doc = {  
    "field1": dict(docsite), # or docsite.copy() 
    "field2": dict(docsite), # or docsite.copy() 
} 
2

Python不與對象的拷貝工作,分配你的領域docsite的時候,無論是衛星值指向同一個對象。您可以使用id()方法檢查:id(doc['field2']) == doc['field1']。如果您需要初始對象的不同副本,請使用deepcopy

import copy 
doc['field2'] = copy.deepcopy(docsite) 

更新:當然,這需要導入copy模塊才能使用它(由Andriy Ivaneyko爲下劃線)。

+0

該代碼將失敗,因爲'copy'模塊未導入。 –

+0

@Andriy Ivaneyko,你是對的。這個答案並不打算提供一個完整的工作代碼,它只是強調可變對象是通過引用傳遞的,也是爲什麼存在deepcopy。這是否有足夠的理由下調?無論如何修復 – jlandercy

+0

你會混淆用戶而不指向複製模塊,因爲它看起來像'deepcopy'是Python的內置方法沒有這樣的指向... –

1

在第二個字典中,將指針保存到docsite。所以,當你改變它時,它將會改變。

要解決它,你必須複製。

doc = {  
    "field1":docsite.copy(), 
    "field2":docsite.copy(), 
} 

我不知道複製功能,如果它不工作,只是儘量谷歌"python clone dictionary"