Skip to content

Latest commit

 

History

History
274 lines (191 loc) · 5.07 KB

File metadata and controls

274 lines (191 loc) · 5.07 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- 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个特点

    1. 无序
    2. 元素唯一
  • 集合方法

方法名 功能说明
add 添加元素,已存在则无操作
clear 清空集合所有元素
remove 删除指定元素,不存在则报错
discard 删除指定元素,不存在则无操作
pop 随机删除并返回一个元素,空集合则报错
  • 不能修改 的 有序容器 是 元组

图片描述

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

冰封集合

  • frozenset

图片描述

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

图片描述

回忆

s = set("ab")
s.add("c")
s
  • 这明显是能改的

图片描述

  • frozenset 怎么冰封 呢?

frozenset

  • 冻住的集合
fs = frozenset("ab")
fs.add("c")
  • 构造之后就不能增删改了
    • 就像元组一样

图片描述

  • 列表 可以改
    • 但是 元组 不行
  • 集合 可以改
    • 但 冰封集合 不行
  • 集合 能直接赋值吗?

直接赋值

  • 等号(=)赋值
    • 把地址 直接赋过去
s1 = {0, 1}
s2 = s1
id(s1)
id(s2)
s1.add(2)

图片描述

  • 想要 两个不同集合 怎么办?

copy

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 是不可变的 常量

图片描述

  • 可以作为 集合项 吗?

frozenset

import copy
s1 = {0, 1, frozenset({1, 2})}
s2 = copy.deepcopy(s1)
  • 貌似可以的
    • frozenset({1, 2})
    • 是 常量
    • 可以哈希的
    • 可以作为 集合项

图片描述

  • 而且 深拷贝 确实 深到底层了

总结

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

图片描述

  • 集合 有啥运算 呢?🤔

图片描述

  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。