如何正确复制嵌套的字典对象? [英] How can I properly copy nested dictionary objects?

查看:102
本文介绍了如何正确复制嵌套的字典对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 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以避免重复代码,但是如果我这样做,我会遇到一个问题,当我修改任何国家/地区的dicts(esp,ben,por)时,它们都是同时修改的. /p>

我们假设字典是空的,我这样做

log_data['esp']['user']['created']['today'] = 'asdasdasda'

其他所有字典现在都具有相同的值,就像generic_dict一样.

print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}
print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}

我了解发生了什么,但我不知道如何避免这种情况

  • 复制嵌套字典对象的最佳方法是哪一种?

解决方案

您可以使用

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

I was trying to use the generic dict to avoid repeating code but I have a problem if I do like this, when I modify any of the country dicts (esp, ben, por) all are modifying at the same time.

Let's assume the dictionary is empty and I do this

log_data['esp']['user']['created']['today'] = 'asdasdasda'

all the other dicts now have the same value like generic_dict is the same all of them.

print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}
print log_data['ben']['user']['created']
Output: {'today': 'asdasdasda'}

I understand what's happening but I don't know how to avoid that

  • Which is the best way copy nested dictionary objects ?

解决方案

You can use copy.deepcopy to create a new copy of the generic_dict object, like this

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


Otherwise, you can have a constructor function, like this

def generic_dict():
    return {'user': {'created': {}, 'modified': {}, 'errors': {}},
            'usermon': {'created': {}, 'modified':{}, 'ignored': {}, 'errors': {}}}

And then call it to create a new dictionary object every time, like this

log_data = {
    'esp': generic_dict(),
    'por': generic_dict(),
    'sui': generic_dict(),
    'ben': generic_dict(),
    'mex': generic_dict(),
    'arg': generic_dict(),
}

这篇关于如何正确复制嵌套的字典对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆