Python 如何正确复制嵌套字典对象?
我正在从事一个使用Python 2.7的项目,在这个项目中,我有一个“复杂”的字典结构,我试图做如下工作:Python 如何正确复制嵌套字典对象?,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我正在从事一个使用Python 2.7的项目,在这个项目中,我有一个“复杂”的字典结构,我试图做如下工作: generic_dict = { 'user': {'created': {}, 'modified': {}, 'errors': {}}, 'usermon': {'created': {}, 'modified': {}, 'ignored': {}, 'errors': {}} log_data = { 'esp': generic_dict,
generic_dict = {
'user': {'created': {}, 'modified': {}, 'errors': {}},
'usermon': {'created': {}, 'modified': {}, 'ignored': {}, 'errors': {}}
log_data = {
'esp': generic_dict,
'por': generic_dict,
'sui': generic_dict,
'ben': generic_dict,
'mex': generic_dict,
'arg': generic_dict,
}
我试图使用泛型dict来避免重复代码,但如果我这样做的话,我会遇到一个问题,当我修改任何一个国家的dict(esp、ben、por)时,所有这些都会同时修改
假设字典是空的,我会这样做
log_data['esp']['user']['created']['today'] = 'asdasdasda'
所有其他dict现在都具有相同的值,就像generic_dict是所有dict一样
print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}
print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}
我知道发生了什么,但我不知道如何避免
- 复制嵌套字典对象的最佳方法是什么李>
通用dict
对象的新副本,如下所示
from copy import deepcopy
log_data = {
'esp': deepcopy(generic_dict),
'por': deepcopy(generic_dict),
'sui': deepcopy(generic_dict),
'ben': deepcopy(generic_dict),
'mex': deepcopy(generic_dict),
'arg': deepcopy(generic_dict),
}
def generic_dict():
return {'user': {'created': {}, 'modified': {}, 'errors': {}},
'usermon': {'created': {}, 'modified':{}, 'ignored': {}, 'errors': {}}}
log_data = {
'esp': generic_dict(),
'por': generic_dict(),
'sui': generic_dict(),
'ben': generic_dict(),
'mex': generic_dict(),
'arg': generic_dict(),
}
否则,您可以有一个构造函数,如下所示
from copy import deepcopy
log_data = {
'esp': deepcopy(generic_dict),
'por': deepcopy(generic_dict),
'sui': deepcopy(generic_dict),
'ben': deepcopy(generic_dict),
'mex': deepcopy(generic_dict),
'arg': deepcopy(generic_dict),
}
def generic_dict():
return {'user': {'created': {}, 'modified': {}, 'errors': {}},
'usermon': {'created': {}, 'modified':{}, 'ignored': {}, 'errors': {}}}
log_data = {
'esp': generic_dict(),
'por': generic_dict(),
'sui': generic_dict(),
'ben': generic_dict(),
'mex': generic_dict(),
'arg': generic_dict(),
}
然后每次调用它来创建一个新的dictionary对象,如下所示
from copy import deepcopy
log_data = {
'esp': deepcopy(generic_dict),
'por': deepcopy(generic_dict),
'sui': deepcopy(generic_dict),
'ben': deepcopy(generic_dict),
'mex': deepcopy(generic_dict),
'arg': deepcopy(generic_dict),
}
def generic_dict():
return {'user': {'created': {}, 'modified': {}, 'errors': {}},
'usermon': {'created': {}, 'modified':{}, 'ignored': {}, 'errors': {}}}
log_data = {
'esp': generic_dict(),
'por': generic_dict(),
'sui': generic_dict(),
'ben': generic_dict(),
'mex': generic_dict(),
'arg': generic_dict(),
}