从列表中选择Python字典,在不影响原列表的情况下进行修改



我有一个字典列表,类似于:

dict_list_all = [{'name': 'dict_00',
'steps': {'step_00': False,
'step_01': False,
'step_02': False},
},
{'name': 'dict_01',
'steps': {'step_00': False,
'step_01': False,
'step_02': False},
},
{'name': 'dict_01',
'steps': {'step_00': False,
'step_01': False,
'step_02': False},
},
]

我想根据用户输入从这个列表中选择一个字典。然后,一旦选择了这个字典,修改选中字典中'steps'键下的布尔值,而不影响原始列表。

我正在做这样的事情

user_input = input('Which dict do you need?')
selected_dict = [d for d in dict_list_all if d['name'] == user_input][0]

此时,我认为我正在从列表中创建我想要的字典的一个独立副本(selected_dict)。但是,当我修改selected_dict中的值时,dict_list_all中字典中的相应值也会相应地改变。我怎样才能避免这种情况呢?

我试着使用:

selected_dict = [d for d in dict_list_all if d['name'] == user_input][0].copy()
selected_dict = [d for d in dict_list_all.copy() if d['name'] == user_input][0].copy()

但是isisus仍然存在,我该如何解决这个问题?

您可以使用copy.deepcopy(和next与生成器):

from copy import deepcopy
selected_dict = next(deepcopy(d) for d in dict_list_all if d['name'] == user_input)

next具有节省内存(如不构建list)和短路的优点。

从简单的dict.copy中得到的浅拷贝将是一个新的顶级dict对象,但是任何值(我们只关心可变的),如嵌套字典,将仍然引用原始的。

听起来你想要一个深度拷贝。例如:

import copy
selected_dict = [copy.deepcopy(d) for d in dict_list_all.copy() if d['name'] == user_input][0]

相关内容

  • 没有找到相关文章