当前位置: 首页 > article >正文

Python程序设计 深浅拷贝

对象引用、浅拷贝、深拷贝(拓展、难点、重点)

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果

其实这个是由于共享内存导致的结果

拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。

先看 一个非拷贝的例子

使用=赋值(对象引用)

=赋值:数据完全共享

=赋值是在内存中指向同一个对象,

如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变

如果是不可变类型 (immutable) ,比如字符串,修改了其中一个,另一个并不会变

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = 'surprise'
>>> a
['surprise', 2, 3]

>>> b
['surprise', 2, 3]
>>> b[0] = 'I hate surprises'
>>> b
['I hate surprises', 2, 3]
>>> a
['I hate surprises', 2, 3]

浅拷贝(copy)

浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)

>>> a = [1, 2, 3]
>>> b = a.copy()
>>> c = list(a)
>>> d = a[:]

>>> a[0] = 'integer lists are boring'
>>> a
['integer lists are boring', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]

深拷贝(deepcopy)

深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)

深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。

深拷贝的方法有

>>> import copy
>>> a = [1, 2, 3, [1, 2, 3]]
>>> b = copy.copy(a)
>>> a[3][0] = "surprises"
>>> b
[1, 2, 3, ['surprises', 2, 3]]

>>> c = copy.deepcopy(b)
>>> b[3][0] = "i hate surprises"
>>> c
[1, 2, 3, ['surprises', 2, 3]]
>>> b
[1, 2, 3, ['i hate surprises', 2, 3]]

总结

copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 copy.deepcopy 深拷贝 拷贝对象及其子对象


http://www.kler.cn/a/229929.html

相关文章:

  • 【.net core】【sqlsugar】子查询时的注意事项(持续更新)
  • spring boot3.3.5 logback-spring.xml 配置
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)
  • Android 13 Aosp 默认允许应用动态权限
  • 【SpringBoot】28 API接口防刷(Redis + 拦截器)
  • 了解 CSS position 属性
  • 必看!嵌入式基于UART的通信协议-RS232、RS485协议解析
  • 挂耳耳机哪个牌子好?推荐几款性价比超高的挂耳耳机
  • 反射的理解
  • PyTorch 2.2 中文官方教程(二十)
  • React 实现表单组件
  • 2024/2/5总结
  • 中科大计网学习记录笔记(六):应用层概述 | 应用层原理
  • Linux中有名管道和无名管道
  • Cuda编程注意小事项
  • 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别
  • SpringBoot过滤器获取响应的参数
  • 性能实测:分布式存储 ZBS 与集中式存储 HDS 在 Oracle 数据库场景表现如何
  • 101 C++内存高级话题 内存池概念,代码实现和详细分析
  • IDEA插件ChatGPT - Easycode安装使用
  • 2020年通信工程师初级 综合能力 真题
  • 为什么说Python语法简单?
  • OpenAI Gym高级教程——领域自适应强化学习
  • 【C++】win11,OpenCV安装教程(VS2022)
  • 【C语言】贪吃蛇 详解
  • SQL--DDL