如果已经问过这个问题,我感到非常抱歉,但是虽然我可以找到类似的东西,但没有找到具体的问题。我有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?
答案 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
的更多信息在您的代码中,您使用的是浅表副本,但需要上述文档中的深表副本:
浅表副本构造一个新的复合对象,然后(到 在可能的范围内)将引用插入其中 原始的。
深层副本会构造一个新的复合对象,然后递归地 将原始对象中的对象的副本插入其中。