Python 如何正确复制嵌套字典对象?

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,

我正在从事一个使用Python 2.7的项目,在这个项目中,我有一个“复杂”的字典结构,我试图做如下工作:

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(),
}