Python深拷贝与浅拷贝

Python深拷贝与浅拷贝教程

深拷贝是指,拷贝对象的具体内容,内存地址是自主分配的,拷贝结束之后俩个对象虽然存的值是一样的,但是内存地址不一样,俩个对象页互相不影响,互不干涉。

浅拷贝是指,对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。注意:当内存销毁的时候,指向对象的指针,必须重新定义,才能够使用。

浅拷贝

浅拷贝包括:使用切片的形式,对 字典 进行拷贝和调用对象的拷贝方法:dict.copy()。

深拷贝

深拷贝包括: 调用 copy.copy() 方法和调用 copy.deepcopy() 方法。

案例

字典浅拷贝

使用字典的直接赋值,实现两个字典的浅拷贝

print("嗨客网(www.haicoder.net)") # 使用字典的直接赋值,实现两个字典的浅拷贝 dic = {"Name": "HaiCoder", "Age": 100, "Score": 99.5} dic1 = dic print("Dic =", dic) print("Dic1 =", dic1) dic["Name"] = "haicoder" print("Dic =", dic) print("Dic1 =", dic1)

程序运行后,控制台输出如下:

118 python字典深拷贝与浅拷贝.png

我们使用 {} 创建了一个字典 dic,字典中有三个元素,接着,我们使用 = 将字典 dic 直接赋值给字典 dic1,实现了字典的拷贝。

接着,我们修改了字典 dic 的键为 Name 的对象的值,最后,我们使用 print 打印字典 dic 和字典 dic1 的内容,发现字典 dic 和字典 dic1 的内容都被修改了。

因为,使用直接赋值是浅拷贝的形式,因此字典 dic 和字典 dic1 指向的是同一块内存区间,因此字典 dic 被修改,字典 dic1 也会被修改。

字典内置的copy函数实现字典浅拷贝

使用字典内置的 copy 函数实现字典的浅拷贝

print("嗨客网(www.haicoder.net)") # 使用字典内置的 copy 函数实现字典的浅拷贝 dic = {"Name": "HaiCoder", "Age": 100, "Score": 99.5} dic1 = dic.copy() print("Dic =", dic) print("Dic1 =", dic1) dic["Name"] = "haicoder" print("Dic =", dic) print("Dic1 =", dic1)

程序运行后,控制台输出如下:

119 python字典深拷贝与浅拷贝.png

使用字典对象内部的 copy 方法实现的拷贝同样是浅拷贝,因此字典 dic 和字典 dic1 指向的是同一块内存区间,因此字典 dic 被修改,字典 dic1 也会被修改。

copy 实现字典深拷贝

使用 copy 实现字典深拷贝

import copy print("嗨客网(www.haicoder.net)") # 使用 copy 实现字典深拷贝 dic = {"Name": "HaiCoder", "Age": 100, "Score": 99.5} dic1 = copy.copy(dic) print("Dic =", dic) print("Dic1 =", dic1) dic["Name"] = "haicoder" print("Dic =", dic) print("Dic1 =", dic1)

程序运行后,控制台输出如下:

120 python字典深拷贝与浅拷贝.png

使用 copy 模块的 copy 方法实现的拷贝是深拷贝,因此字典 dic 和字典 dic1 指向的是不同的内存区间,因此字典 dic 被修改,字典 dic1 不会被修改。

deepcopy 实现字典拷贝

使用 deepcopy 实现字典拷贝

import copy print("嗨客网(www.haicoder.net)") # 使用 deepcopy 实现字典拷贝 dic = {"Name": "HaiCoder", "Age": 100, "Score": 99.5} dic1 = copy.deepcopy(dic) print("Dic =", dic) print("Dic1 =", dic1) dic["Name"] = "haicoder" print("Dic =", dic) print("Dic1 =", dic1)

程序运行后,控制台输出如下:

121 python字典深拷贝与浅拷贝.png

使用 copy 模块的 deepcopy 方法实现的拷贝是深拷贝,因此字典 dic 和字典 dic1 指向的是不同的内存区间,因此字典 dic 被修改,字典 dic1 不会被修改。

Python深拷贝与浅拷贝总结

浅拷贝包括:使用切片的形式,对字典进行拷贝和调用对象的拷贝方法:dict.copy()。深拷贝包括: 调用 copy.copy() 方法和调用 copy.deepcopy() 方法。