一:直接赋值
赋值,就是对象的引用,给对象起别名。
i = 8
j = i
print("值是:",i, "地址:",id(i))
print("值是:",j, "地址:",id(j))
输出如下:
值是: 8 地址: 1639640400
值是: 8 地址: 1639640400
i 是一个int类型的对象,j 是指向 i 变量对应的对象,其实是内存地址。可以看到,j和i的值和地址都是一样的,
b = a: 赋值引用,a 和 b 都指向同一个对象。
二:浅拷贝
拷贝父对象,不会拷贝对象的内部的子对象。
a = [1,2,[3,4,5,6]] b = a.copy() print(a, " ", id(a), id(a[2])) print(b, " ", id(b), id(b[2])) a[2].append("abc") print(a) print(b)
输出如下:可以看到,a和b的内存地址不一样,但a[2]和b[2]的内存地址是一样的,说明指向的是同意个对象,对父对象进行操作,会印象拷贝对象。
[1, 2, [3, 4, 5, 6]] 2091843623432 2091843623368 [1, 2, [3, 4, 5, 6]] 2091843623752 2091843623368 [1, 2, [3, 4, 5, 6, 'abc']] [1, 2, [3, 4, 5, 6, 'abc']]
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
三:深拷贝
copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
import copy a = [1,2,[3,4,5,6]] b = copy.deepcopy(a) print(a, " ", id(a), id(a[2])) print(b, " ", id(b), id(b[2])) a[2].append("abc") print(a) print(b)
输出如下:可以看到,这一次a和b的内存地址也不一样了,且对父对象进行操作,不会印象拷贝对象。
[1, 2, [3, 4, 5, 6]] 2143840475656 2143840475592 [1, 2, [3, 4, 5, 6]] 2143840475976 2143840475912 [1, 2, [3, 4, 5, 6, 'abc']] [1, 2, [3, 4, 5, 6]]
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
参考文章:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
***************不积跬步无以至千里***************