问:深拷贝、浅拷贝、直接赋值的区别是什么?并举例说明
1.区别
(1)直接赋值:对象的引用
(2)浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象
(3)深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象
定义说得有点抽象,简而言之:
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
(1)如果B跟着也变了,说明是浅拷贝,
(2)如果B没有改变,说明是深拷贝
2.举例说明
(1)直接赋值
# 直接赋值
# 定义列表
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
# 直接赋值
names1 = names #无论 names中修改了什么,names与names1保持完全一致
# 修改原列表
names[1] = "test6"
names[-3][0] = "nice"
# 打印结果
print("names:",names)
print("names1:",names1)
输出结果:
names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
names1: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
解析:直接赋值,names 和 names1 指向同一个对象
(2)浅拷贝
# 浅拷贝
# 定义列表
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
# 浅拷贝列表
names1 = names.copy()
# 修改原列表 names
names[1] = "test6"
names[-3][0] = "nice"
# 打印
print("names:",names)
print("names1:",names1)
输出结果:
names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
names1: ['test1', 'test2', 'test3', ['nice', 'mike'], 'test4', 'test5']
解析:浅拷贝,拷贝父对象,不会拷贝对象的内部的子对象,他们的子对象 Y 还是指向同一个对象
(3)深拷贝
# 深拷贝
# 引入 copy 模块
import copy
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
names1 = copy.deepcopy(names)
# 修改原列表
names[-3][0] = "ken"
# 打印结果
print("names:",names)
print("names1:",names3)
输出结果:
names: ['test1', 'test2', 'test3', ['ken', 'mike'], 'test4', 'test5']
names1: ['test1', 'test2', 'test3', ['kangkang', 'mike'], 'test4', 'test5']
解析:深拷贝,names 和 names1 完全拷贝了父对象及其子对象,两者完全独立