我有一个字典列表,类似于:
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]