python 实例对象 浅拷贝_Python3 入门教程——浅拷贝深拷贝差别
前言
在 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 入门教程——浅拷贝深拷贝差别相关推荐
- keil obj 文件 结构_【Python】数据分析前的入门教程 Python For Everybody P2:数据结构...
这是密歇根大学课程Python For Everybody总结的P2部分.课程总结P1部分的地址如下: P1: 零基础程序设计(Python 入门) carolinezhq:[Python]数据分析前 ...
- python很全的爬虫入门教程
python很全的爬虫入门教程 一.爬虫前的准备工作 首先,我们要知道什么是爬虫 1.什么是网络爬虫? 网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...
- 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game
系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...
- python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...
- python中文编程教学_Python入门教程完整版400集(懂中文就能学会)快来带走
2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...
- Python自动化办公:pandas入门教程
在后台回复[阅读书籍] 即可获取python相关电子书~ Hi,我是山月. 今天给大家带来一个强大的朋友:pandas.如果你有许多数据分析任务的话,那你一定不能错过它. 由于它的内容比较多,因此会分 ...
- python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...
本文档最新版为 3.8,旧版本可能放弃维护,推荐阅读最新版! Python 入门教程 Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并能够用简单又有效的方式进行面向对象编 ...
- 树莓派python界面qt_树莓派QT入门教程——使用Qt开发界面程序控制GPIO
树莓派QT入门教程--使用Qt开发界面程序控制GPIO 玩转树莓派2017-07-12 12:36 树莓派入门教程--使用Qt开发界面程序 前言 Qt是一个1991年由奇趣科技开发的跨平台C++图形用 ...
- python文件目录管理 项目_Python入门教程完整版(懂中文就能学会)
今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔 本套教程学习时间15天 1-3天内容:为Linux基 ...
最新文章
- 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析
- STM32使用GPIO_WriteBit()函数使LED灯闪烁
- Android开发之多Fragment切换优化
- lisp直线连接圆象限电_圆并不难,为什么很多考生就是学不会?
- UA STAT675 统计计算I 随机数生成1 随机数生成器的一般理论
- SQL注入漏洞全接触--高级篇
- 用Java中的抽象类扩展抽象类
- 21秋期末考试财务会计(二)10165k2
- CSS中的resize属性
- 数据库零碎---常用的mysql命令,收藏了,方便查阅
- 系统架构师论文-论新技术的引进
- 前台获取model中的值,json数据,json字符串,双引号变为 ‘ quto;‘
- php对接抖音小程序担保支付/头条小程序担保支付
- 计算机局域网访问受限制,电脑本地连接受限制的处理方法
- scipy csc csr到底是什么东西
- Linux【网络库】| 【02 <netdb.h>】以及网络常用结构体
- eclipse和mysql餐厅点餐系统_基于安卓Android手机点餐APP系统的设计(Eclipse,MySQL)
- Failed to create Anaconda Menus
- 清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
- USB-C(TYPE-C)接口安卓手机直播方案/同时直播跟充电的方案