120赋值、浅拷贝和深拷贝
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。[专业选修]列表_直接赋值_浅拷贝_shallowcopy_深拷贝_deepcopy
回忆
- 配套视频
- 上次我们 了解了 多维列表排序
- 默认是 直接比大小

- 可迭代对象students
- 对于students中的 每次迭代的x
- 可以按照 lambda表达式 排序
- 多维列表 的 赋值
- 有 什么
特点吗??🤔
人物1出现
man = ["oeasy",[165,70]]
- 一个人
- 叫做oeasy
- 体征数据
- 身高165
- 体重70

- 想拿 这个人的数据
- 再复制出 一个人 来
嵌套 embedded
man = ["oeasy",[165,70]]
clone = man
- 观察 两个列表

- 指向 同一个地方
- 会有啥
问题吗?
索引嵌套元素
man = ["oeasy",[165,70]]
clone = man
man[0] = "o2z"
print(clone)
- man 和 clone
- 存在 同一个空间
- 一改全改

- 不想 一改全改 ?🤔
copy()
- 使用copy方法
-
可以 分别存储
man = ["oeasy",[165,70]]
clone = man.copy()
man[0] = "o2z"
print(clone) -
两个列表
- 确实 引用不同地址了
- 能够 独立修改

- 但是 身高、体重 列表
- 所在空间 还是 相同的
- 会有什么后果吗?
多维列表
- 新开了 空间
-
复制名字
-
没有问题
man = ["oeasy",[165,70]]
clone = man.copy()
man[0] = "o2z"
print(clone)
man[1][0] = 166
print(clone)
clone[1][1] = 180
print(man) -
新开了 空间
- 复制 身高、体重 列表
- 但复制的是 列表的 地址

- 复制出来的 地址
- 还是 指向 同一空间
- 还是 一改全改
温故
- 拷贝 copy 过程
- 新建列表
- 复制 每个列表项

- 但 如果
- 列表项 是 列表
- 复制的是 列表的地址
- 还是指向 同一空间
copy 函数
-
查询文档
help(list.copy)
-
list类 的 copy函数

- 返回的是
- 列表的浅拷贝
- shallow copy(浅拷贝)
- 这是什么意思?
深拷贝
- 浅拷贝(shallow copy)
- shallow = 浅的,表面的
- 只拷贝 最浅层的
- 浅浅的拷贝
- 不申请 新的内存空间
浅拷贝不行
- 有
深拷贝吗?
- 提问

- 动手试试
具体操作
- 有深浅变化
-
才有意思啊
import copy
man = ["oeasy",[165,70]]
clone = copy.deepcopy(man)
clone[1][0] = 65 -
申请了 新空间

- 深拷贝 能有多
深呢??
知深浅
-
来个深的
import copy
l1 = [1, [2, [3, 4, [5, 6]]]]
l2 = copy.deepcopy(l1) -
这么深的话
- 深拷贝 都能 都复制出来 么?
深拷贝的威力
- 深拷贝
- 讲究一个
深字 - 要多深 有多深

- 完全独立的 空间
- 互不影响
赋值、拷贝总结
- 等号赋值
-
完全共享
-
一改全改
l2 = l1
-
浅拷贝 copy()
-
浅层独立
-
深层共享
l2 = l1.copy()
-
深拷贝 deepcopy
-
全新空间
-
彻底独立
l2 = copy.deepcopy(l1)
-
内存的状态
- 会 影响到 方方面面
列表嵌套
x = [[0]]
x = x * 3
print(x)
x[0].append(1)
print(x)
- x 是 二维列表
- 然后 x 乘以 3
- 得到 [[0],[0],[0]]
- 三个列表项 指向 同一位置

- 然后再追加

- 如果 我只想要
- 给 第0个列表项
追加呢?
新情况
x = [[0], [0], [0]]
x[0].append(1)
- 这和刚才
- 完全不同

- 三个列表项
- 存在 三个地方
- 用deepcopy
- 可以吗?
乘法
from copy import deepcopy
x = [[0]]
x = deepcopy(x) * 3
x[0].append(1)
- 乘法 不行

- 因为 同一个地址 乘了三次
加法
from copy import deepcopy
x = [[0]]
x = deepcopy(x) + deepcopy(x) + deepcopy(x)
x[0].append(1)
- 加法可以
- 每个 都是 深拷贝 出来的 副本

- 每个 加数
- 都分配了 新空间
总结
- 赋值的 三种情况
|------------------|-------------|
| 赋值方式 | 核心特点(大白话口诀) |
| = | 共用地址,一改全改 |
| copy() | 浅层独立,深层共用 |
| deepcopy() | 全部独立,互不干扰 |

- 我想复制节奏
