Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0120
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在:
个人网站: `https://oeasy.org`
蓝桥云课: `https://www.lanqiao.cn/courses/3584`
GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 上次我们 了解了 多维列表排序
- 默认是 直接比大小
-
可迭代对象students
- 对于students中的 每次迭代的x
- 可以按照 lambda表达式 排序
-
多维列表 的 赋值
- 有 什么
特点吗??🤔
- 有 什么
man = ["oeasy",[165,70]]
- 一个人
- 叫做oeasy
- 体征数据
- 身高165
- 体重70
- 想拿 这个人的数据
- 再复制出 一个人 来
man = ["oeasy",[165,70]]
clone = man- 指向 同一个地方
- 会有啥
问题吗?
- 会有啥
man = ["oeasy",[165,70]]
clone = man
man[0] = "o2z"
print(clone)- man 和 clone
- 存在 同一个空间
- 一改全改
- 不想 一改全改 ?🤔
- 使用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 过程
- 新建列表
- 复制 每个列表项
- 但 如果
- 列表项 是 列表
- 复制的是 列表的地址
- 还是指向 同一空间
- 查询文档
help(list.copy)
- list类 的 copy函数
- 返回的是
- 列表的浅拷贝
- shallow copy(浅拷贝)
- 这是什么意思?
-
浅拷贝(shallow copy)
- shallow = 浅的,表面的
- 只拷贝 最浅层的
- 浅浅的拷贝
- 不申请 新的内存空间
- 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个列表项
追加呢?
- 给 第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() |
全部独立,互不干扰 |
- 我想复制节奏
- 这里面 有什么说法吗?🤔
- 下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。

















