更改副本,但更改父级。为什么?

时间:2017-03-11 16:59:35

标签: python

我创建了2d列表,然后将其复制并使用f2函数更改副本的第一个元素。但不知何故原始列表也发生了变化。但我认为按值创建副本,它不会引用父类。如何更改副本列表而不更改原始文件?

def f2(m):
    m[0][0] = 99

k = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
m = k[:][:] #[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(k)
f2(k)
print(m)

2 个答案:

答案 0 :(得分:2)

k[:][:]没有创建列表k的深层副本。这就是为什么更改m中的值也会改变k中的值的原因。您可以改为使用python deepcopy

from copy import deepcopy
m = deepcopy(k)

如python docs中所述:

  

浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。

     

深层复制构造一个新的复合对象,然后以递归方式将副本插入到原始对象中找到的对象。

详细了解深度复制和浅层复制here

答案 1 :(得分:0)

m = k[:][:]创建列表的深层副本。它只是使用第一个[:]创建一个浅层副本,然后使用第二个[:]创建该浅层副本的另一个浅层副本。

请尝试m = [x[:] for x in k]