python核心编程之深拷贝和浅拷贝
该文档仅用作学习笔记,转载请表明出处
定义
1.浅拷贝:浅拷贝是对于一个对象的顶层拷贝。
2.深拷贝:深拷贝完全拷贝了父对象及其子对象。
案例
浅拷贝案例v02:
a = [1,2,3]
b = a
print(id(a))
print(id(b))
输出的结果为:
此时有:变量 a 与 变量 b 同时指向了内存中的同一片数据
浅拷贝案例v03:
import copy
#定义一个ID类用来存储人物id 类似身份证号
class ID:
def __init__(self,id):
self.id = id
# 定义一个People类用来储存任务信息 信息有name:姓名 age:年龄 id:人物id
class People:
def __init__(self,name,age,id):
self.name = name
self.age = age
self.id = id
if __name__ == '__main__':
id1 = ID("123456")
lili = People("莉莉",15,id1)
#利用 copy模块中的copy函数 进行拷贝
dana = copy.copy(lili)
#分别打印lili dana lili.id dana.id 的id
print(id(lili))
print(id(dana))
print(id(lili.id))
print(id(dana.id))
输出结果为:
在这里我们可以看到的是,我们利用了copy模块中的copy函数来进行拷贝,虽然在“ lili ”和“ dana ”的id不同,但是在类的下一层类中还是指向了同一片内存中。即“ lili.id ”和“ dana.id ”的id还是相同的。如图所示:
深拷贝案例v04:
import copy
#定义一个ID类用来存储人物id 类似身份证号
class ID:
def __init__(self,id):
self.id = id
# 定义一个People类用来储存任务信息 信息有name:姓名 age:年龄 id:人物id
class People:
def __init__(self,name,age,id):
self.name = name
self.age = age
self.id = id
if __name__ == '__main__':
id1 = ID("123456")
lili = People("莉莉",15,id1)
#利用 copy模块中的deepcopy函数 进行拷贝
dana = copy.deepcopy(lili)
#分别打印lili dana lili.id dana.id 的id
print(id(lili))
print(id(dana))
print(id(lili.id))
print(id(dana.id))
输出结果为:
在这里们可以看到,利用copy模块中的deepcopy函数进行拷贝,不仅仅是“ lili ”和“ dana ”的id不同,而且“ lili.id ”和“ dana.id ”的id也是不同的,此时在内存中的存在方式如图所示: