Python的赋值引用, 浅拷贝和深拷贝

111 阅读1分钟

前言

有个朋友昨天问了我这个问题, 刚好挺长时间没写博客了, 就顺便划划水

赋值引用

赋值引用其实就是最基本也是最常用的引用, 即:

a = [1, 2, 3]
b = a
a[0] = 2
print(b)   # [2, 2, 3]

就相当于下面的过程
在这里插入图片描述
所以当b=a时, 其实就是将b指向a的内存地址, 当a改变的时候, b也会随之改变

浅拷贝

浅拷贝就是只复制一份最外层元素, 生成一个新的内存地址, 但是如果原元素里有子对象, 比如列表字典这种, 就还是会指向之前的内存地址

import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)
a.append(5)
print(b)  # [1, 2, [3, 4]]
a[2].append(6)
print(a)  # [1, 2, [3, 4, 6], 5]
print(b)  # [1, 2, [3, 4, 6]]

在这里插入图片描述
列表的切片就是浅拷贝

深拷贝

深拷贝其实就没啥说的了, 就是完全复制前对象, 跟前对象没有任何的关系

import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
a.append(5)
print(b)  # [1, 2, [3, 4]]
a[2].append(6)
print(a)  # [1, 2, [3, 4, 6], 5]
print(b)  # [1, 2, [3, 4]]

在这里插入图片描述
完全独立

补充

数字和字符串都是对源对象的引用, 即只是指向不同的内存地址