a=b、深拷贝和浅拷贝
a=b、深拷贝和浅拷贝
- 1. `b = a`:同一对象的"别名"
- 2. `b = a[:]` 或 `b = a.copy()`:浅拷贝("半独立"副本)
- 3. `b = copy.deepcopy(a)`:深拷贝("完全独立"副本)
- 用二维列表举例验证
1. b = a
:同一对象的"别名"
- 本质:
b
和a
指向同一块内存地址,是同一个对象的两个名字。 - 表现:无论修改
a
或b
的任何层级(浅层、深层),两者都会完全同步变化。 - 类比:相当于给同一个文件创建了一个快捷方式,操作快捷方式和原文件会影响同一个文件。
2. b = a[:]
或 b = a.copy()
:浅拷贝("半独立"副本)
- 本质:创建新的外层对象,但外层对象中存储的嵌套引用(如二维数组的行) 仍指向原对象的嵌套结构。
- 表现:
- 对浅层内容(如一维列表的元素、字典的顶层键值对)的修改,只会影响新对象,原对象不受影响。
- 对嵌套结构(如二维列表的子列表、字典中的嵌套字典)的修改,会同步影响原对象(因为共享嵌套结构的地址)。
- 类比:相当于复制了一个文件夹,文件夹本身是新的,但里面的子文件是原文件的快捷方式,修改子文件会影响原文件。
3. b = copy.deepcopy(a)
:深拷贝("完全独立"副本)
- 本质:创建全新的对象,并递归复制所有层级的内容(包括最深层的嵌套结构),新对象与原对象没有任何内存共享。
- 表现:无论修改
b
的浅层还是深层内容,a
都不会有任何变化,两者完全独立。 - 类比:相当于把文件夹及里面所有子文件都完整复制了一份,新文件夹和原文件夹毫无关联,修改任何内容都互不影响。
用二维列表举例验证
import copya = [1, 2, [3, 4]] # 一维元素 + 嵌套列表(二维结构)# 1. 直接赋值
b = a
b[0] = 100 # 修改浅层
b[2].append(5) # 修改嵌套
print(a) # [100, 2, [3, 4, 5]](全受影响)# 2. 浅拷贝(a[:] 或 a.copy())
a = [1, 2, [3, 4]] # 重置a
c = a.copy()
c[0] = 100 # 修改浅层
c[2].append(5) # 修改嵌套
print(a) # [1, 2, [3, 4, 5]](仅嵌套受影响)# 3. 深拷贝
a = [1, 2, [3, 4]] # 重置a
d = copy.deepcopy(a)
d[0] = 100 # 修改浅层
d[2].append(5) # 修改嵌套
print(a) # [1, 2, [3, 4]](完全不受影响)
这三种操作的核心差异就在于内存共享的程度:完全共享(b=a
)→ 部分共享(浅拷贝)→ 完全不共享(深拷贝)。