Skip to content

Latest commit

 

History

History
337 lines (237 loc) · 5.54 KB

File metadata and controls

337 lines (237 loc) · 5.54 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0120
- 这是 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` 
---

列表 - 深拷贝 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() 全部独立,互不干扰

图片描述

  • 我想复制节奏

图片描述

  • 这里面 有什么说法吗?🤔
  • 下次再说 👋

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