首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >oeasy Python 126 [专业选修]集合_冰封集合_拷贝_浅拷贝_深拷贝

oeasy Python 126 [专业选修]集合_冰封集合_拷贝_浅拷贝_深拷贝

原创
作者头像
oeasy
发布2026-07-14 08:43:08
发布2026-07-14 08:43:08
20
举报

[专业选修]集合_冰封集合_拷贝_浅拷贝_深拷贝

回忆

  • 集合 有2个特点
    1. 无序
    2. 元素唯一
  • 集合方法

方法名

功能说明

add

添加元素,已存在则无操作

clear

清空集合所有元素

remove

删除指定元素,不存在则报错

discard

删除指定元素,不存在则无操作

pop

随机删除并返回一个元素,空集合则报错

  • 不能修改 的 有序容器 是 元组
  • 不能修改的 无序容器 叫什么呢?🤔

冰封集合

  • frozenset
  • frozen 来自于 freeze
    • 冻住的意思

回忆

代码语言:javascript
复制
s = set("ab")
s.add("c")
s
  • 这明显是能改的
  • frozenset 怎么冰封 呢?

frozenset

  • 冰封的集合
代码语言:javascript
复制
fs = frozenset("ab")
fs.add("c")
  • 构造之后 就不能 增删改 了
    • 像 元组 不可以修改
    • 就 冻住了

可修改类型

不可修改类型

列表(list)

元组(tuple)

集合(set)

冰封集合(frozenset)

  • 集合 能直接赋值吗?

直接赋值

  • 等号(=)赋值
    • 把地址 直接赋过去
代码语言:javascript
复制
s1 = {0, 1}
s2 = s1
id(s1)
id(s2)
s1.add(2)
  • 想要 两个不同集合 怎么办?

copy

代码语言:javascript
复制
s1 = {0, 1}
s2 = s1.copy()
print(id(s2) == id(s1))
s1.add(2)
  • 不过 这是 shallow 拷贝
    • 浅拷贝
  • 怎么证明 copy是
    • 拷贝 呢?

构造

代码语言:javascript
复制
s1 = {1, 2, (3, 4)}
s2 = s1.copy()
  • s1 中有三个元素
    • 数字 1
    • 数字 2
    • 元组(3,4)
  • s2 是 s1 的浅拷贝
    • s2 有自己独立的地址
    • 但是他的元组元素和 s1 的元组
      • 指向了相同的地址空间
  • 这就是 拷贝
    • 我想要 拷贝
  • 怎么办呢?

深拷贝

代码语言:javascript
复制
from copy import deepcopy
s1 = {1, 2, (3, 4)}
s2 = deepcopy(s1)
print(id(s2) == id(s1))
s1.add(0)
  • 子元组 还是 指向同一位置?
    • 为什么会这样呢?

元组的深拷贝

  • 测试 元组的深拷贝
代码语言:javascript
复制
from copy import deepcopy
t1 = (3, 4)
t2 = deepcopy(t1)
id(t1)
id(t2)
  • 从内存地址观察
    • 元组的深拷贝
  • 因为 元组的深拷贝 就是 本身
    • 两个元组 指向 同一位置
  • 拷贝
    • 深 在 哪里 呢?

深拷贝

  • 深拷贝 对列表是 最有效的
  • 把集合中的元组
    • 改成列表

集合元素

代码语言:javascript
复制
import copy
s1 = {1, [2, 3]}
s2 = copy.deepcopy(s1)
  • 报错了
  • 列表不是 hashable 的元素
    • 列表 不是常量
      • 而是 变量
      • 特征 不固定
    • 所以不能被 哈希算法 算出特征值
  • 所以
    • 列表不能
    • 作为 集合的元素
  • 如果 把列表
    • 放到 元组 里面呢?

元组项

  • 嵌套在里面的 列表
    • 还是变量
    • 不可被hash算法
      • 确定为值
  • 列表 不能作为 集合项
  • 那集合 可以
    • 作为集合项么?

集合里的集合

  • 集合 也是 变量
    • 不是 常量
    • 也 哈希不出值 来
    • 也不能作为 集合项
  • frozenset 是不可变的 常量
  • 可以作为 集合项 吗?

frozenset

代码语言:javascript
复制
import copy
s1 = {0, 1, frozenset({1, 2})}
s2 = copy.deepcopy(s1)
  • 貌似可以的
    • frozenset({1, 2})
    • 是 常量
    • 可以哈希的
    • 可以作为 集合项
  • 而且 拷贝 确实 到底层了
    • 如果是 拷贝 会如何呢?

浅拷贝

代码语言:javascript
复制
s1 = {0, 1, frozenset({1, 2})}
s2 = s1.copy()
  • 浅拷贝 拷贝的 还是
    • 最浅的一层

总结

  • 这次 学习了 冰封集合
    • 不能修改的 集合
    • 就是 冰封集合

可修改类型

不可修改类型

列表(list)

元组(tuple)

集合(set)

冰封集合(frozenset)

  • 集合 有啥运算 呢?🤔
  • 下次再说 👋

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [专业选修]集合_冰封集合_拷贝_浅拷贝_深拷贝
  • 回忆
    • 冰封集合
    • 回忆
    • frozenset
    • 直接赋值
    • copy
    • 构造
    • 深拷贝
    • 元组的深拷贝
    • 深拷贝
    • 集合元素
    • 元组项
    • 集合里的集合
    • frozenset
    • 浅拷贝
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档