或许你在其他编程语言比如C++有听说过拷贝分深拷贝和浅拷贝。这两个概念区别就是你复制的是一份对象的引用还是对象本身。今天我们来看一下python的赋值、浅层拷贝和深层拷贝的区别。
开始之前,先看一段代码。
import copy
arr = [ [1, 2, 3], [4, 5, 6] ]
assigned = arr #assign
swallow_copied = copy.copy(arr) #swallow copy
deep_copied = copy.deepcopy(arr) # deep copy
这里看到了我们声明了一个二维数组arr,并使用这个arr赋值了assigned、浅拷贝了swallow_copied和深拷贝了deep_copied。
我们使用python tour来看下三者在object层是如何布置的。
很清楚看到 :
接上段代码,接着来修改object。加入了在swallow_copied和deep_copied的操作代码,并和原来的arr进行比较。
import copy
arr = [ [1, 2, 3], [4, 5, 6] ]
assigned = arr #assign
swallow_copied = copy.copy(arr) #swallow copy
deep_copied = copy.deepcopy(arr) # deep copy
print("before:")
print("arr:", arr)
print("swallow_copied:", swallow_copied)
print("deep_copied:", deep_copied)
swallow_copied.append([7, 8, 9])
swallow_copied[0].append(3.5)
print()
print("after swallow copy:")
print("arr:", arr)
print("swallow_copied:", swallow_copied)
deep_copied.append([7, 8, 9])
deep_copied[0].append(3.5)
print()
print("after deep copy:")
print("arr:", arr)
print("deep_copied:", deep_copied)
使用python tour观察这段代码,你看到区别了吗?
一开始我们的数组长这样:
before:
arr: [ [1, 2, 3], [4,5,6] ]
swallow_copied: [ [1,2,3], [4,5,6] ]
deep_copied:[ [1,2,3], [4,5,6] ]
经过这两行代码进行浅层拷贝之后
swallow_copied.append([7, 8, 9])
swallow_copied[0].append(3.5)
swallow_copied变成
after swallow copy:
arr: [ [1, 2, 3, 3.5], [4,5,6] ]
swallow_copied: [ [1, 2, 3, 3.5], [4, 5, 6], [7, 8, 9]]
可以看到虽然我只是操作swallow_copied,但是由于swallow_copied和arr共享了swallow_copied[0]的对象,所以这里arr[0]也跟着改变。
然后再经过这两行代码进行深层拷贝之后
deep_copied.append([7, 8, 9])
deep_copied[0].append(3.5)
deep_copied变成
after deep copy:
arr: [ [1, 2, 3, 3.5], [4,5,6] ]
deep_copied: [ [1, 2, 3, 3.5], [4, 5, 6], [7, 8, 9]]
可以看到操作deep_copied并没有改变arr。
我们来看下python的赋值copy和deepcopy操作,以及对mutable和immutable类型操作的区别。
先来看一段代码
x = 5
print(x)
y=x
print(y)
x += 1
print(x)
print(y)
从这段代码的执行结果来看,x+=1并没有改变y。也就是说虽然y=x,但是x和y并不是同一个object。
python把object分为两种类型:
python对不同类型也有不同的处理方式
浅层拷贝和深拷贝只有在操作immutable对象时有区别。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。