python学习笔记3:复制(深复制与浅复制)

对于不可变对象,我们直接用b=a后,对b进行修改不必担心a被修改了;
对于可变对象,直接用b=a后,修改b可能对a有影响,但如果我们可变对象需要保留一份原始内容,怎么办?对于简单列表[1,2,[3,4]]或更复杂的[1,2,[3,[4,5]]],可能我们可以直接将列表的内容拷贝一份,但对于列表中还含有包含列表的变量或者自定义类型中包含多层次结构的对象等,这种方法就显得力不从心了,况且,这种方式也不便于阅读,这就需要深度复制来解决


一、概念

容器或集合:如果某个对象包含对其他对象的引用,则将其称为容器或集合,以下是针对容器的两种复制方式

浅复制:将创建一个新对象,但它包含的是对原始对象中项的应用
深复制:将创建一个新对象,并且递归的复制它包含的所有对象


二、列表复制实例
实例1:列表浅复制——list():

a=[1,2,[3,4]]
b=list(a)
a
b
b[2][0]=99
a
b
b.append(100)
a
b
python学习笔记3:复制(深复制与浅复制)_第1张图片

实例2:列表浅复制——模仿list的行为
a=[1,2,[3,4]]
b=[]
for i in a:
b.append(i)


a
b
b[2][0]=99
a
b
b.append(100)
a
b
python学习笔记3:复制(深复制与浅复制)_第2张图片

实例3:列表浅复制——copy.copy()
import copy
a=[1,2,[3,4]]
b=copy.copy(a)
a
b
b[2][0]=99
a
b
b.append(100)
a

b


python学习笔记3:复制(深复制与浅复制)_第3张图片

实例4:列表浅复制——copy.deepcopy()
import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
a
b
b[2][0]=99
a
b
b.append(100)
a
b
python学习笔记3:复制(深复制与浅复制)_第4张图片

实例5:深复制
a=[1,2,3,4]
b=[]
for i in a:
b.append(i)


a
b
b[2]=99
a
b
b.append(100)
a

b

python学习笔记3:复制(深复制与浅复制)_第5张图片

实例1的图示分析:
python学习笔记3:复制(深复制与浅复制)_第6张图片


个人总结:

如果从复制深度来理解,那么,最终递归复制的对象都是不可变对象,则称为深复制;如果递归复制的对象还存在可变对象,则称为浅复制.

如果将[1,2,3]包含一层对象;[1,2,[3,4]]称为包含两层对象;[1,2,[3,[4,5,6]]]称为包含3层对象,要实现深复制,分别需要1、2、3层循环。如果对包含2层对象进行最多两层循环的复制,则可以将其称为1层浅复制(如实例1,2,3);如果对包含1层对象进行最多1层循环的复制,这时就可以称为深复制(如实例5)



三、很棒的深复制——copy.deepcopy()

实例6:深复制——copy.deepcopy()

import copy

class mytype(object):
def __init__(self,value1,value2):
self.value1=value1
self.value2=value2




a=mytype(1,[2,3])
import copy
b=copy.deepcopy(a)
a.value1=99
a.value2[0]=88
a.value1
a.value2
b.value1

b.value2

python学习笔记3:复制(深复制与浅复制)_第7张图片

从上图结果可以看出,系统提供的copy.deepcopy()功能还是非常强大的,用它除了可以进行列表的深复制,还可以对自定义类型进行深复制,以后编程需要的话,就用它好了

你可能感兴趣的:(Python)