E0_copy = list(E0)后,我猜E0_copy是E0的深度拷贝,因为id(E0)不等于id(E0_copy)。然后我在循环中修改了E0_copy,但是为什么E0之后不一样了?
E0 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for k in range(3):
E0_copy = list(E0)
E0_copy[k][k] = 0
#print(E0_copy)
print E0 # -> [[0, 2, 3], [4, 0, 6], [7, 8, 0]]
如果你的列表元素是不可变对象,那么你可以使用这个,否则你必须从copy模块中使用deepcopy。
你也可以使用最短的方法来深度复制列表,就像这样。
a = [0,1,2,3,4,5,6,7,8,9,10]
b = a[:] #deep copying the list a and assigning it to b
print id(a)
20983280
print id(b)
12967208
a[2] = 20
print a
[0, 1, 20, 3, 4, 5, 6, 7, 8, 9,10]
print b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
在Python中,有一个名为copy的模块,它有两个有用的函数:
import copy
copy.copy()
copy.deepcopy()
Copy()是一个浅拷贝函数。如果给定的参数是一个复合数据结构,例如一个列表,那么Python将创建另一个相同类型的对象(在这种情况下,是一个新列表),但对于旧列表中的所有内容,只有它们的引用被复制。可以这样想:
newList = [elem for elem in oldlist]
直观地,我们可以假设deepcopy()将遵循相同的范例,唯一的区别是,对于每个elem,我们将递归地调用deepcopy,(就像mbguy的答案一样)
但这是错误的!
Deepcopy()实际上保留了原始复合数据的图形结构:
a = [1,2]
b = [a,a] # there's only 1 object a
c = deepcopy(b)
# check the result
c[0] is a # False, a new object a_1 is created
c[0] is c[1] # True, c is [a_1, a_1] not [a_1, a_2]
这是棘手的部分:在deepcopy()过程中,使用哈希表(Python中的字典)将每个旧对象ref映射到每个新对象ref,这防止了不必要的重复,从而保留了复制的复合数据的结构。
官方文档