前言

在 Python 中提供了一个用于拷贝操作的 copy 模块,该模块中提供 浅拷贝 和 深拷贝 两种操作,其中:

浅拷贝:只是将对象管理地址进行打包复制,其内部的元素的并未进行复制,而是使用旧的存储地址。

深拷贝 :是将对象中的所有元素进行复制,然后重新开辟空间来存储。

对象和内存

对象和内存中的值是映射的关系,当需要取内存中的值的时候,需要通过其变量名去获取。

内存中的值是单一的,但其映射的对象可以是多个,所以某一个对象修改其内存的值后,其所有的映射到该内存上的对象都会刷新到最新的值。

实例如下:

>>> a = [1,2,3] # 定义一个变量(对象)

>>>

>>> b = a # 将变量的 a 的值赋给变量 b

>>> id(a) # 查看 a 的存储内存空间

3070831436L

>>> id(b) # 查看 b 的存储内存空间

3070831436L

>>>

>>> a.append(4) # 给 a 对象列表,添加一个新的元素 ‘4’

>>> a # 查看 a 的值

[1, 2, 3, 4]

>>> b # 查看 b 的值

[1, 2, 3, 4]

>>>

通过以上可以看到,不同变量之间,相同的值存储的内存空间是一样的;当使用 a 变量修改其内容时,b 变量的值也会放生改变。

浅拷贝

特点:浅拷贝只复制变量的整体引用地址,不会复制变量内部元素的地址。当内部元素发生变化时,复制后的值和会随着赋值对象的变化而变化。

实例如下:

>>> import copy

>>> a = [1,2,['a','b'],3] # 定义嵌套列表

>>> b = copy.copy( a ) # 复制a(浅拷贝)

>>> a

[1, 2, ['a', 'b'], 3]

>>> b

[1, 2, ['a', 'b'], 3]

>>> id(a)

3070610124L # 查看 a 与 b 变量的地址

>>> id(b)

3070631500L

#查看列表 a 与 b 中第 2 个元素的地址:

>>> id(a[1])

163477668

>>> id(b[1])

163477668

#查看列表 a 与 b 中的第 3 个元素(嵌套列表)的地址:

>>> id(a[2])

3070631436L

>>> id(b[2])

3070631436L

#可见它们的地址还是同一个存储地址

# 接下来是改变 a 的值,然后再查看 b 的值:

>>> a[2].append('c')

>>> a

[1, 2, ['a', 'b', 'c'], 3]

>>> b

[1, 2, ['a', 'b', 'c'], 3]

分析:通过观察可知 浅拷贝时,当改变元素内部的值时,复制后对象的值,会随着赋值前对象值的变化而变化。

由于数字类型为不可变类型,所以复制前后的存储位置是一致的,并不存在同值不同存储位置的情况。

因为 数字类型 为不可变类型,所以这里不加以比较!

提示:在大列表中 添加/修改 元素,复制后的值不受影响。

深拷贝

特点:深拷贝会将数据全部复制,然后重新开辟新的空间来储存该值。所以,复制后的值都是相对独立的,后期使用并不受复制前的对象所影响。

基本语法:

deepcopy(x, memo=None, _nil=[])

参数说明:x 是赋值的对象 、memo 和 _nil 参数可缺省。

实例如下:

>>> import copy

>>> a = [4,5,['a','b'],6]

>>> b = copy.deepcopy(a) # 使用深拷贝复制 a 对象

>>> a

[4, 5, ['a', 'b'], 6]

>>> b

[4, 5, ['a', 'b'], 6]

>>>

#查看列表 a 和 b 中的嵌套列表,可见它们的地址是独立的:

>>> id(a[2])

3070658220L

>>> id(b[2])

3069923596L

# 修改 a 列表中的嵌套列表,观察其变化:

>>> a[2].append('c')

>>> a

[4, 5, ['a', 'b', 'c'], 6, 'c']

>>> b

[4, 5, ['a', 'b'], 6]

# 可见修改 a 后 b 也不会发生任何的变化

分析:通过以上可见,采用深拷贝操作后,是将被复制对象的所有值进行拷贝,然后重新开辟新的存储单元来存储拷贝后的内容,所以复制后的内容并不受前面被复制对象的改变而改变。

喜欢 (0)or分享 (0)

python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别相关推荐

  1. keil obj 文件 结构_【Python】数据分析前的入门教程 Python For Everybody P2:数据结构...

    这是密歇根大学课程Python For Everybody总结的P2部分.课程总结P1部分的地址如下: P1: 零基础程序设计(Python 入门) carolinezhq:[Python]数据分析前 ...

  2. python很全的爬虫入门教程

    python很全的爬虫入门教程 一.爬虫前的准备工作 首先,我们要知道什么是爬虫 1.什么是网络爬虫? 网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...

  3. 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game

    系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...

  4. python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...

  5. python中文编程教学_Python入门教程完整版400集(懂中文就能学会)快来带走

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  6. Python自动化办公:pandas入门教程

    在后台回复[阅读书籍] 即可获取python相关电子书~ Hi,我是山月. 今天给大家带来一个强大的朋友:pandas.如果你有许多数据分析任务的话,那你一定不能错过它. 由于它的内容比较多,因此会分 ...

  7. python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...

    本文档最新版为 3.8,旧版本可能放弃维护,推荐阅读最新版! Python 入门教程 Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并能够用简单又有效的方式进行面向对象编 ...

  8. 树莓派python界面qt_树莓派QT入门教程——使用Qt开发界面程序控制GPIO

    树莓派QT入门教程--使用Qt开发界面程序控制GPIO 玩转树莓派2017-07-12 12:36 树莓派入门教程--使用Qt开发界面程序 前言 Qt是一个1991年由奇趣科技开发的跨平台C++图形用 ...

  9. python文件目录管理 项目_Python入门教程完整版(懂中文就能学会)

    今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔 本套教程学习时间15天 1-3天内容:为Linux基 ...

最新文章

  1. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析
  2. STM32使用GPIO_WriteBit()函数使LED灯闪烁
  3. Android开发之多Fragment切换优化
  4. lisp直线连接圆象限电_圆并不难,为什么很多考生就是学不会?
  5. UA STAT675 统计计算I 随机数生成1 随机数生成器的一般理论
  6. SQL注入漏洞全接触--高级篇
  7. 用Java中的抽象类扩展抽象类
  8. 21秋期末考试财务会计(二)10165k2
  9. CSS中的resize属性
  10. 数据库零碎---常用的mysql命令,收藏了,方便查阅
  11. 系统架构师论文-论新技术的引进
  12. 前台获取model中的值,json数据,json字符串,双引号变为 ‘ quto;‘
  13. php对接抖音小程序担保支付/头条小程序担保支付
  14. 计算机局域网访问受限制,电脑本地连接受限制的处理方法
  15. scipy csc csr到底是什么东西
  16. Linux【网络库】| 【02 <netdb.h>】以及网络常用结构体
  17. eclipse和mysql餐厅点餐系统_基于安卓Android手机点餐APP系统的设计(Eclipse,MySQL)
  18. Failed to create Anaconda Menus
  19. 清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
  20. USB-C(TYPE-C)接口安卓手机直播方案/同时直播跟充电的方案

热门文章

  1. 如何使用窗体开发-理解那些函数怎么来的?
  2. 朗讯项目的一个概括总结.
  3. php header功能的使用
  4. 原生JS实现跨浏览器的事件处理程序
  5. 代码控制UI,View
  6. HBase总结(十三)HBase Shell 常用命令及例子
  7. 汇编语言--CMOS RAM芯片
  8. c++ set有序性
  9. MySQL笔记9:内连接、左连接、右连接以及全连接查询
  10. C语言中:在头文件中使用static定义变量意味着什么?