我的剧本如下:
list0=[[0,1,2],[3,4,5],[5,6,7]]
list2=list(list0)
list2[0][0]=20
print(list0) # displays [[20, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2) # displays [[20, 1, 2], [3, 4, 5], [5, 6, 7]]如您所见,修改我的list2修改以及list0。但是,我注意到使用函数list()创建了list2。它不应该创建一个真正的新列表吗?
我不明白为什么它在这里行不通。
另一方面,它下面的另一个例子起作用了:
list0=[[0,1,2],[3,4,5],[5,6,7]]
list2=list(list0)
list2[0]=[20,30,40]
print(list0) # prints [[8, 9, 10], [3, 4, 5], [5, 6, 7]]
print(list2) # prints [[20, 30, 40], [3, 4, 5], [5, 6, 7]]: Good !我的问题:
为什么它在第一个示例中不起作用,而在第二个示例中工作呢?如何确保没有这个问题,并“真正”创建一个新的列表,如果我修改这个新的,旧的将永远不会被修改,无论在这个旧列表中有什么。
是因为list2和list0指向不同的元素。因此,修改list2i不会修改list0i。但是,list2i和list0i指向同一个列表,因此修改list2i将修改list0i?在某种程度上,我在某些层次上创建了不同的引用,但不是为所有级别创建的引用。
发布于 2021-12-02 12:45:28
这里的问题是,虽然list2 = list(list0)使外部列表在两个实例之间有所不同,但所有内部列表仍然相同。要避免这种情况,可以使用copy.deepcopy
from copy import deepcopy
list0 = [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
list2 = deepcopy(list0)
list2[0][0] = 20
print(list0) # [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2) # [[20, 1, 2], [3, 4, 5], [5, 6, 7]]或嵌套列表理解:
list0 = [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
list2 = [list(sublist) for sublist in list0]
list2[0][0] = 20
print(list0) # [[0, 1, 2], [3, 4, 5], [5, 6, 7]]
print(list2) # [[20, 1, 2], [3, 4, 5], [5, 6, 7]]但请注意,如果嵌套深度不同,则必须调整后一种方法。
发布于 2021-12-02 12:31:23
不,list()将其参数转换为列表。因此,您将list2作为引用list0的变量。你要找的是copy()。
https://stackoverflow.com/questions/70199472
复制相似问题