Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0126
- 这是 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`
----
集合 有2个特点
- 无序
- 元素唯一
-
集合方法
| 方法名 | 功能说明 |
|---|---|
| add | 添加元素,已存在则无操作 |
| clear | 清空集合所有元素 |
| remove | 删除指定元素,不存在则报错 |
| discard | 删除指定元素,不存在则无操作 |
| pop | 随机删除并返回一个元素,空集合则报错 |
- 不能修改 的 有序容器 是 元组
- 不能修改的 无序容器 叫
什么呢?🤔
- frozenset
- frozen 来自于 freeze
- 冻住的意思
s = set("ab")
s.add("c")
s
- 这明显是能改的
- frozenset 怎么冰封 呢?
- 冻住的集合
fs = frozenset("ab")
fs.add("c")
- 构造之后就不能增删改了
- 就像元组一样
- 列表 可以改
- 但是 元组 不行
- 集合 可以改
- 但 冰封集合 不行
- 集合 能直接
赋值吗?
- 等号(=)赋值
- 把地址 直接赋过去
s1 = {0, 1}
s2 = s1
id(s1)
id(s2)
s1.add(2)
- 两个变量 引用 同一个地址
- 想要 两个不同集合 怎么办?
s1 = {0, 1}
s2 = s1.copy()
print(id(s2) == id(s1))
s1.add(2)
- 不过这是一个 shallow 拷贝
- 浅拷贝
- 怎么证明copy是浅拷贝呢?
s1 = {1, 2, (3, 4)}
s2 = s1.copy()
- s1 中有三个元素
- 数字 1
- 数字 2
- 元组(3,4)
- s2 是 s1 的浅拷贝
- s2 有自己独立的地址
- 但是他的元组元素和 s1 的元组
- 指向了相同的地址空间
- 这就是浅拷贝
- 我想要深拷贝
- 怎么办呢?
from copy import deepcopy
s1 = {1, 2, (3, 4)}
s2 = deepcopy(s1)
print(id(s2) == id(s1))
s1.add(0)
- 子元组 还是 指向同一位置?
- 为什么会这样呢?
- 测试 元组的深拷贝
from copy import deepcopy
t1 = (3, 4)
t2 = deepcopy(t1)
id(t1)
id(t2)
- 从内存地址观察
- 元组的深拷贝
- 因为 元组的深拷贝 就是 本身
- 两个元组 指向 同一位置
- 那
深拷贝- 深 在 哪里 呢?
- 深拷贝 对列表是 最有效的
- 把集合中的元组
- 改成列表
import copy
s1 = {1, [2, 3]}
s2 = copy.deepcopy(s1)
- 报错了
- 列表不是 hashable 的元素
- 列表 不是常量
- 而是 变量
- 特征 不固定
- 所以不能被
哈希算法算出特征值
- 列表 不是常量
- 所以
- 列表
不能 - 作为 集合的元素
- 列表
- 如果 把列表
- 放到 元组 里面呢?
- 嵌套在里面的 列表
- 还是变量
- 不可被hash算法
- 确定为值
- 那集合 可以
- 作为集合元素么?
- 集合 也是 变量
- 不是 常量
- 也 哈希不出值 来
- 也不能作为 集合元素
- frozenset 是不可变的 常量
- 可以作为 集合项 吗?
import copy
s1 = {0, 1, frozenset({1, 2})}
s2 = copy.deepcopy(s1)
- 貌似可以的
- frozenset({1, 2})
- 是 常量
- 可以哈希的
- 可以作为 集合项
- 而且 深拷贝 确实 深到底层了
- 这次 学习了 冰封集合
- 不能修改的 集合
- 就是 冰封集合
- 集合 有啥运算 呢?🤔
- 下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。



















