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

  • 我想复制节奏
相关推荐
xiaohua10099 分钟前
Linux-JVM线程查询
linux·jvm
xrkhy16 分钟前
redis-shake的使用windows版本
数据库·windows·redis
今天你AiPy了吗21 分钟前
AI桌面助手的隐私底线 数据可落本地不出域,还能一键切换云端,全能智能体
人工智能·python·ai·ai编程·智能体
2601_9563198825 分钟前
近期手工规则转量化:按学习、表达、开发、验证推进
人工智能·python
青 春 记 忆32 分钟前
LeetCode 104. 二叉树的最大深度|Python 解法详解
python·算法·leetcode
码云骑士41 分钟前
110-多模型热切换-API网关-LiteLLM代理-负载均衡故障转移
运维·python·负载均衡
blueSatchel44 分钟前
u-boot启动过程(bootROM到SPL到u-boot)
linux·u-boot
Ali885201 小时前
Python字符串方法速查表大全
前端·python
开源量化GO1 小时前
近期量化实现:API 数据、策略逻辑和交易执行要连成一条线
人工智能·python