nginx反向代理 flash build vue响应式布局 sql数据库教学视频 nginx学习视频 录音棚设备一套多少钱 查看oracle连接数 hbase集群搭建 python开发安卓应用 svn查看历史版本 mysql事务 python参考手册 java的包 java环境变量配置 java循环语句 java获取本地时间 java函数调用 linux文档 迷宫解锁 unix操作系统下载 小程序源码下载 影视后期软件 begininvoke 编程语言实现模式 地下城怎么双开 微信砍价活动怎么做 蓝牙测试软件 js切割字符串 python数组赋值 子节点 ps反向选择的快捷键 光头强换肤助手 万能低格工具还原u盘 quickchm 复仇之矛天赋 字符串分割 ae渲染设置 未来教育考试系统 谷歌浏览器升级
当前位置: 首页 > 学习教程  > 编程学习

copy 修改时间_图解 Python 中深浅拷贝(copy)

2021/1/9 2:04:37 文章标签: 深浅拷贝

在工作中,常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生…

在工作中,常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。今天就说一下Python中的深浅拷贝问题。

一、深浅copy

  1. 赋值运算
l1 = [1, 2, 3, [22, 33]]l2 = l1l1.append(666)print(l1)  # [1, 2, 3, [22, 33], 666]print(l2)  # [1, 2, 3, [22, 33], 666]

图解:

dd867eeae6cf92a2533696e322506e76.png

注意:l2 = l1是一个指向,是赋值,和深浅copy无关。

  1. 浅copy

其实列表是一个一个的槽位,每个槽位存储的是该对象的内存地址

#例1. 给大列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()# 或者下面这种方式,也是浅copy# import copy# l2 = copy.copy(l1)l1.append(666)print(l1)  # [1, 2, 3, [22, 33], 666]print(l2)  # [1, 2, 3, [22, 33]]#例2. 给小列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[-1].append(666)print(l1)  # [1, 2, 3, [22, 33, 666]]print(l2)  # [1, 2, 3, [22, 33, 666]]、例3. 将l1列表中第一个元素改为6l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[0] = 6print(l1)  # [6, 2, 3, [22, 33]]print(l2)  # [1, 2, 3, [22, 33]]

图解:

例1

bc82f2310dd4735f8826b1bd81c54cab.png

例2

7fb26796a439d5314eb16bf0d28a3a24.png

例3

c614b1a4917a4265f9ae6997c913492d.png

小结:

浅copy:会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址。

  1. 深copy
import copyl1 = [1, 2, 3, [22, 33]]l2 = copy.deepcopy(l1)l1.append(666)print(l1)  # [1, 2, 3, [22, 33], 666]print(l2)  # [1, 2, 3, [22, 33]]

图解:

本质如下图:

d7707afebc5ff2ad5fcef5d0d45195a8.png

但是python对深copy做了一个优化,将可变的数据类型在内存中重新创建一份,而不可变的数据类型则沿用之前的,所以内存中是下面这样的:

c0c980b903626eb5ba9f2a45c866bf87.png

小结:

深copy:会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变数据类型则沿用之前的。

为什么Python默认的拷贝方式是浅拷贝?

  • 时间角度:浅拷贝花费时间更少。
  • 空间角度:浅拷贝花费内存更少。
  • 效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。

总结:

  • 不可变对象在赋值时会开辟新空间。
  • 可变对象在赋值时,修改一个的值,另一个也会发生改变。
  • 深、浅拷贝对不可变对象拷贝时,不开辟新空间,相当于赋值操作。
  • 浅拷贝在拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。
  • 深拷贝在拷贝时,会逐层进行拷贝,直到所有的引用都是不可变对象为止。
  • Python 有多种方式实现浅拷贝,copy模块的copy 函数 ,对象的 copy 函数 ,工厂方法,切片等。
  • 大多数情况下,编写程序时,都是使用浅拷贝,除非有特定的需求。
  • 浅拷贝的优点:拷贝速度快,占用空间少,拷贝效率高。

本文链接: http://www.dtmao.cc/news_show_1100267.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?