初始化一个字典,其中每个项目都是一个空的唯一列表的列表

时间:2020-02-24 09:41:44

标签: python python-3.x list dictionary

如果已经问过这个问题,我感到非常抱歉,但是虽然我可以找到类似的东西,但没有找到具体的问题。我有Python 3.7.4-64位。基本上,我想初始化一个字典,其中每个元素都是一个空列表。问题是,按照我现在的方式,即使我将列表的副本分配给每个项目,我也会从不同项目的列表中得到每个空的子列表都是同一对象。如下面的代码所示,empty_list_of_lists中的每个子列表都是一个不同的对象。然后,将这些项作为empty_list_of_lists的副本分配给字典。当我打电话给my_dict['a'] is my_dict['b']时,我会得到预期的False,但是当我打电话给my_dict['a'][0] is my_dict['b'][0]时,我会得到一个True,这使我感到困惑,因为empty_list_of_lists[0] is empty_list_of_lists[1]返回了False而且我不明白逻辑。我该怎么办?

这是我的代码:

empty_list_of_lists = [[] for i in range(5)]

print(empty_list_of_lists[0] is empty_list_of_lists[1]) # returns False --> expected

dict1 = {'a': empty_list_of_lists.copy(), 'b': empty_list_of_lists.copy()}

print(dict1['a'] is dict1['b'])  # returns False --> expected
print(dict1['a'][0] is dict1['b'][0])  # returns True --> What?

1 个答案:

答案 0 :(得分:0)

您可以使用:

dict1 = {'a': [[] for _ in range(5)], 'b': [[] for _ in range(5)]}

或者您可以使用copy.deepcopy

import copy

dict1 = {'a': copy.deepcopy(empty_list_of_lists), 'b': copy.deepcopy(empty_list_of_lists)}

您可以了解有关浅复制和深复制操作here

的更多信息

在您的代码中,您使用的是浅表副本,但需要上述文档中的深表副本:

浅表副本构造一个新的复合对象,然后(到 在可能的范围内)将引用插入其中 原始的。

深层副本会构造一个新的复合对象,然后递归地 将原始对象中的对象的副本插入其中。