我有一个具有一定价值的清单。我需要将列表中的数据作为初始值分配给字典中的所有键。 我希望仅将变量的数据分配给键,而不是变量。我返回的代码会更改变量值,从而为每个键更改它。 如何仅复制变量中的数据以分配给键。我了解代码已创建了相同变量的引用。我想知道如何在没有任何引用的情况下从变量分配数据
#Initialize Dictionary with values of List
my_list = [0] * 20
my_dict = {"A_key":my_list ,"B_key":my_list,"C_key":my_list}
#Edit Dictionary
my_dict["A_key"][4] = "Changed_Data"
#Print values
print(my_dict)
print(my_list)
实际结果
{'B_key': [0, 0, 0, 0, 'Changed_Data', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'A_key': [0, 0, 0, 0, 'Changed_Data', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'C_key': [0, 0, 0, 0, 'Changed_Data', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
[0, 0, 0, 0, 'Changed_Data', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
预期结果
{'B_key': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'A_key': [0, 0, 0, 0, 'Changed_Data', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'C_key': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
答案 0 :(得分:2)
发生这种情况的原因是您正在修改主列表,而不是该特定键的值,您可以在分配它们时创建多个列表,也可以在将它们分配给字典时创建列表的多个副本。您可以通过以下方法来完成
my_dict = {"A_key":my_list[:] ,"B_key":my_list[:],"C_key":my_list[:]}
my_dict["A_key"][4] = "Changed_Data"
这里发生的事情是您将列表从列表的开头复制到结尾。这称为列表切片,您可以在其中将列表从一端“切片”到另一端。对列表进行切片时,它将从起始索引到结束索引返回一个新列表。
您使用[0:10]
提供开始索引,其中0是开始,10是结束。如果不提供开始和结束,则返回整个列表。这可用于复制列表。
但是,这仍然称为“ Shallow Copy”,如果您在此列表中有一个列表,则嵌套列表仍然易于对主列表进行编辑。仍然可以使用称为
的Deepcopy来解决from copy import deepcopy
old_list = [1, 2, 3, [4]]
new_list = deepcopy(old_list)