List()函数行为

时间:2019-01-11 08:07:30

标签: python

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]

这似乎是一个深复制。我很困惑。

3 个答案:

答案 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.