oeasy Python 120[专业选修]列表_直接赋值_浅拷贝_shallowcopy_深拷贝_deepcopy

120赋值、浅拷贝和深拷贝

  • 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。专业选修列表_直接赋值_浅拷贝_shallowcopy_深拷贝_deepcopy

回忆

  • 默认是 直接比大小
  • 可迭代对象students
  • 对于students中的 每次迭代的x
  • 可以按照 lambda表达式 排序
  • 多维列表 的 赋值
  • 有 什么​特点​ 吗??🤔
人物1出现
复制代码
man = ["oeasy",[165,70]]
  • 一个人
  1. 叫做oeasy
  2. 体征数据
  1. 身高165
  2. 体重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 过程
  1. 新建列表
  2. 复制 每个列表项
  • 但 如果
  • 列表项 是 列表
  • 复制的是 列表的地址
  • 还是指向 同一空间
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()​​ | 全部独立,互不干扰 |

  • 我想复制节奏
相关推荐
Agent_大师15 分钟前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码15 分钟前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf28 分钟前
FastAPI 如何连接 MySQL
后端·python
orion5711 小时前
Missing Semester Class1:course overview and introduction of shell
linux
apocelipes14 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户83562907805116 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
用户1204872216118 小时前
Linux驱动编译与加载
linux·嵌入式
MeixianAgent20 小时前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6251 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python
用户805533698031 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式