list
在Python 3中进行浅拷贝还是深拷贝?我编写了以下代码来查看:
X = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Y = list(X) # Makes a shallow copy
X.append([3445])
print(Y)
print(X)
X[0][1]="asddasdsaa"
print(Y)
print(X)
输出:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [3445]]
[[1, 'asddasdsaa', 3], [4, 5, 6], [7, 8, 9]]
[[1, 'asddasdsaa', 3], [4, 5, 6], [7, 8, 9], [3445]]
似乎list
是浅表副本。
具有简单列表的相同代码:
X = [1,23,22]
Y = list(X) # Seems like deep copy
X.append(334)
print(Y)
print(X)
X[0]=222
print(Y)
print(X)
输出:
[1, 23, 22]
[1, 23, 22, 334]
[1, 23, 22]
[222, 23, 22, 334]
这似乎是一个深复制。我很困惑。
答案 0 :(得分:2)
@ user2357112是正确的,真的,什么部分使您成为深拷贝?
实际上@jonrsharpe也是正确的。
所有复制方式(见下文)均为浅复制:
l=l.copy()
l=l[:]
l=list(l)
...
仅 copy.deepcopy
是深层副本:
from copy import deepcopy
l=deepcopy(l)
答案 1 :(得分:1)
在python中,除了int,float,bool,string,unicode和tuple之外的所有其他 可变。
您可以看到list
是可变的。第一个示例是更新/更改"list of lists"
中的列表,而第二个示例中您只是尝试更新“整数列表”(不可变对象),因为int
是不可变,默认情况下为硬拷贝。而且,硬拷贝本质上是昂贵的。
答案 2 :(得分:0)
浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)有关:
浅表副本会构造一个新的复合对象,然后(在可能的范围内)将对原始对象中的对象的引用插入其中。
深层副本会构造一个新的复合对象,然后递归地将原始对象中的对象的副本插入其中。
X = [1,23,22]
Y = list(X) # Seems like deep copy
X.append(334)
print(Y)
print(X)
X[0]=222
print(Y)
print(X)
This case has no compound object,so deep copy and copy are no difference.