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()​​ | 全部独立,互不干扰 |

  • 我想复制节奏
相关推荐
小宋0012 小时前
Ubuntu Terminator(多开并行终端工具)
linux·运维·ubuntu
ZC跨境爬虫2 小时前
海南大学交友平台开发实战 day11(实现性别图标渲染与后端数据关联+Debug复盘)
前端·python·sqlite·html·json
小尔¥2 小时前
keepalived高可用与负载均衡
linux·运维·负载均衡
星星也在雾里2 小时前
Anaconda命令行配置Jupyter Notebook虚拟环境
python·jupyter
极光代码工作室2 小时前
基于机器学习的信用卡欺诈检测系统设计
人工智能·python·深度学习·机器学习
李李李li2 小时前
vmware各种版本下载链接-github
linux·ubuntu·开源软件
残 风2 小时前
linux(Xshell、Xterm)如何搭建隧道间接访问目标服务网站教程
linux·运维·php·信息与通信
迷藏4942 小时前
**超融合架构下的Go语言实践:从零搭建高性能容器化微服务集群**在现代云原生时代,*
java·python·云原生·架构·golang
深度学习lover2 小时前
<数据集>yolo 船舶识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·船舶分类识别