首先,说明一下几点:
对象之间赋值时是按引用传递的引用就是原对象和新对象引用关系,但是里边的元素共用一个内存。
拷贝就是,两个变量的内存地址不同,互不影响。
深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别。
分析一下=、copy()、deepcoy()=:引用关系
copy():浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。
deepcopy():深拷贝 拷贝对象及其子对象
请看下边的代码及解释:
import copy
origin = [1, 2, [3, 4]]
cop1 = origin
cop2 = copy.copy(origin) #copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
cop3 = copy.deepcopy(origin) #copy.deepcopy 深拷贝 拷贝对象及其子对象
origin[2][0] = "hey!"
origin[0] = "hey!"
print("原来的值:",origin)
print("引用值:",cop1)
print("浅拷贝:",cop2)
print("深拷贝:",cop3)
print("************************")
print("初始对象地址",id(origin[0]))
print("引用的对象地址",id(cop1[0]))
print("浅拷贝对象地址",id(cop2[0]))
print("深拷贝对象地址",id(cop3[0])) #这里一样是因为偷懒
print("************************")
print("初始对象地址",id(origin[2][0]))
print("引用的子对象地址",id(cop1[2][0]))
print("浅拷贝子对象地址",id(cop2[2][0]))
print("深拷贝子对象地址",id(cop3[2][0]))
最后的结果为:
原来的值: ['hey!', 2, ['hey!', 4]]
引用值: ['hey!', 2, ['hey!', 4]]
浅拷贝: [1, 2, ['hey!', 4]]
深拷贝: [1, 2, [3, 4]]
************************
初始对象地址 2522241990256
引用的对象地址 2522241990256
浅拷贝对象地址 140704878993808
深拷贝对象地址 140704878993808 #这里的地址一样是因为偷懒,你修改这个cop2的值,不会影响cop3
************************
初始对象地址 2522241989360
引用的子对象地址 2522241989360
浅拷贝子对象地址 2522241989360
深拷贝子对象地址 140704878993872