2016-01-27 41 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"