我在克隆列表时遇到了困难。我已经尝试了我所知道的一切,但我的代码似乎仍然将 errGrid、slopes1、slopes2 和lopes 视为同一个对象。为什么?!
errOrder = [[] for i in range(6)]
errMethod = [errOrder.copy() for i in range(AM)]
errGrid = [errMethod.copy() for i in range(UA)]
slopes1 = list(errGrid.copy())[:]
slopes2 = list(errGrid.copy())[:]
slopes = list(errGrid.copy())[:]
errGrid[0][0][0] = 1
print(errGrid)
print(slopes)
输出:
[[[1, [], [], [], [], []], [[], [], [], [], [], []]]]
[[[1, [], [], [], [], []], [[], [], [], [], [], []]]]
代码的行为是因为
copy()
方法执行的是浅拷贝,而不是深拷贝。
在 Python 中,浅拷贝会创建一个新的对象,该对象包含对原始对象中对象的引用。这意味着,如果对原始对象中可变对象(如列表)进行更改,这些更改将反映在浅拷贝中。
在的代码中,
errGrid
、
slopes1
、
slopes2
和
slopes
都是对同一列表对象的浅拷贝。这意味着,如果更改其中一个列表中的值,这些更改将反映在所有列表中。
为了解决这个问题,需要使用深拷贝。深拷贝会创建一个新的对象,并递归地复制原始对象中的所有对象。
可以使用
copy
模块中的
deepcopy()
函数来创建深拷贝。
以下是如何使用
deepcopy()
函数修改的代码的方法:
import copy
errOrder = [[] for i in range(6)]
errMethod = [errOrder.copy() for i in range(AM)]
errGrid = [errMethod.copy() for i in range(UA)]
slopes1 = copy.deepcopy(errGrid)
slopes2 = copy.deepcopy(errGrid)
slopes = copy.deepcopy(errGrid)
errGrid[0][0][0] = 1
print(errGrid)
print(slopes)
此代码将创建
errGrid
的深拷贝,这意味着
slopes1
、
slopes2
和
slopes
将是独立的列表,不会受到对
errGrid
所做的更改的影响。