关于Python深浅拷贝
拷贝:
说明:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。
何来深浅拷贝的说法?
深浅拷贝的“深”和“浅”可以理解为从变量到硬盘上的物理存储介质之间的层次的多少。
下面用一个示例来解释浅拷贝:
#Author : Kelvin
#Date : 2019/1/5 0:41
import copy
#浅拷贝的第一种方式(使用对象自身的copy方法)
li1=[["bob","alvin"],"kelvin","alex"]
li2=li1.copy() #调用列表自身方法拷贝
li2[1]="kelvin-sb" #修改li2的第二个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(只有li2改变了):
#li1: [['bob', 'alvin'], 'kelvin', 'alex']
# li2: [['bob', 'alvin'], 'kelvin-sb', 'alex']
print("-------"*6)
li2[0][0]="bob-sb" #修改li2的第一个元素中的第一个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(li1和li2都改变了):
# li1: [['bob-sb', 'alvin'], 'kelvin', 'alex']
# li2: [['bob-sb', 'alvin'], 'kelvin-sb', 'alex'] #浅拷贝的第二种方式(使用copy模块的copy方法)
li1=[["bob","alvin"],"kelvin","alex"]
li2=copy.copy(li1) #调用copy模块方法拷贝
li2[1]="kelvin-sb" #修改li2的第二个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(只有li2改变了):
#li1: [['bob', 'alvin'], 'kelvin', 'alex']
# li2: [['bob', 'alvin'], 'kelvin-sb', 'alex']
print("-------"*6)
li2[0][0]="bob-sb" #修改li2的第一个元素中的第一个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(li1和li2都改变了):
# li1: [['bob-sb', 'alvin'], 'kelvin', 'alex']
# li2: [['bob-sb', 'alvin'], 'kelvin-sb', 'alex']
对于上面浅拷贝的示例我们可以看到,当浅拷贝之后,修改其中一个不可变类型元素(数字,字符串等),拷贝前后对象之间互不干扰,没有影响,但是当修改了可变类型元素(列表,字典等),拷贝前后对象均发生改变。其中的原因就是因为不可变类型直接存储在物理硬盘上,而可变类型则会包含多个不可变类型而形成一个独立的内存地址,也就是多了一“层”。下面用图示具体说明:
只改变“kelvin”图示:

改变li1第一个元素(列表)中的值图示:

**注:认真理清图示表达的含义,理解好深浅的内涵。
下面再通过一个示例来了解深拷贝:
import copy
#深拷贝只能调用copy模块的deepcopy方法
li1=[["bob","alvin"],"kelvin","alex"]
li2=copy.deepcopy(li1) #调用copy模块方法拷贝
li2[1]="kelvin-sb" #修改li2的第二个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(只有li2改变了):
#li1: [['bob', 'alvin'], 'kelvin', 'alex']
# li2: [['bob', 'alvin'], 'kelvin-sb', 'alex']
print("-------"*6)
li2[0][0]="bob-sb" #修改li2的第一个元素中的第一个元素
print("li1: ",li1)
print("li2: ",li2)
#运行结果(只有li2改变了):
# li1: [['bob', 'alvin'], 'kelvin', 'alex']
# li2: [['bob-sb', 'alvin'], 'kelvin-sb', 'alex']
深拷贝相比较浅拷贝就容易理解的多,因为深拷贝就是完完全全的拷贝,拷贝前后的两个对象占有独立的内存空间,不存在共享空间,因此拷贝前后对象相互改变无影响。
最后来一个深浅拷贝的应用实例(随意实例):
#Author : Kelvin
#Date : 2019/1/5 1:37 import copy
kelvin=["kelvin",123,[10000,]] #户主 卡号 余额
wife=kelvin.copy() #给媳妇共享银行卡
wife[1]=234 #设置媳妇卡号
wife[0]="peiqi" #媳妇银行卡户主
wife[2][0]-=2000 #媳妇消费2000元
print(kelvin)
print(wife)
print("------"*6)
# 输出结果(实现共享账户):
# ['kelvin', 123, [8000]]
# ['peiqi', 234, [8000]] #小三账户不能浅拷贝,因为媳妇会发现账户少钱
xiaosan=copy.deepcopy(kelvin)
xiaosan[0]="sanzi" #小三银行卡户主
xiaosan[1]=666 #设置小三卡号
xiaosan[2][0]-=3000 #小三消费3000元
print(kelvin)
print(xiaosan)
# 输出结果(老婆不会发现):
# ['kelvin', 123, [10000]]
# ['sanzi', 666, [7000]]
关于Python深浅拷贝的更多相关文章
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
- 小学生都能学会的python(深浅拷贝)
小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...
- 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝
一.数据类型分类 二.Python深浅拷贝
- 底层剖析Python深浅拷贝
底层剖析Python深浅拷贝 拷贝的用途 拷贝就是copy,目的在于复制出一份一模一样的数据.使用相同的算法对于产生的数据有多种截然不同的用途时就可以使用copy技术,将copy出的各种副本去做各种不 ...
- 关于python深浅拷贝的个人浅见
起初,关于python的深浅拷贝,总是习惯去用传值传址的方式去考虑,发现总是get不到规律,容易记混. python有着高度自治的内存管理,而不可变对象的内存分配,则是能省则省,就是说,无论用什么拷贝 ...
- python深浅拷贝与赋值
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- python 深浅拷贝 进阶
主要理解新与旧究竟在哪里 这样也就理解了 深浅拷贝 先说说赋值,事实上python中的赋值事实上是赋值了一个引用.比如: foo1=1.0 foo2=foo1 用操作符is推断时.你能够发现结果是tr ...
- python深浅拷贝&垃圾回收&上下文管理(with语句)
深浅拷贝 在Python中使用copy模块用于对象的拷贝操作. 该模块提供了两个主要的方法:浅拷贝 copy.copy() 深拷贝 copy.deepcopy() 1.浅拷贝(copy) 浅拷贝: 不 ...
- python 深浅拷贝 for循环删除
###########################总结########################### 1. 基础数据类型补充 大多数的基本数据类型的知识.已经学完了 a='aaaa' ls ...
随机推荐
- DD XOFT虚拟键盘鼠标
下载:http://www.ddxoft.com/ 简介:最多用户选择,最简单易用,最稳定可靠 永久免费 系统底层集成,真正的驱动级硬件模拟 一键安装,即为电脑添加一对可完全编程控制的键盘鼠标,轻松自 ...
- Elasticsearch笔记五之java操作es
Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...
- bzoj5251 [2018多省省队联测]劈配
直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...
- BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈
BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...
- BZOJ_2809_[Apio2012]dispatching_可并堆
BZOJ_2809_[Apio2012]dispatching_可并堆 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称 ...
- Android P Beta发布!最新版本抢先体验!
在不久前结束的谷歌I/O开发者大会上,谷歌公布了下一个版本的 Android,也就是 Android P 的 beta 版本.Android P 将 AI 定位为操作系统的核心,并侧重于提供智能且简洁 ...
- I春秋——Misc(贝斯家族)
不好意思呀!最近一直忙着学习python,竟然忘记更新I春秋里面的题目了(QAQ),我以后会时时刻刻提醒自己要更新 永远爱你们的! ----新宝宝 1:贝斯家族: 解题思路:我相信看见这一题都能够想到 ...
- ApplicationHost.config(IIS存储配置区文件)
对于一个刚刚创建网站,以ASP.NET MVC5为例. 我们并没有在网页的配置文件(web.config)中配置一些处理程序或模块,如处理Session的SessionStateModule模块,映射 ...
- 目标检测之YOLO V1
前面介绍的R-CNN系的目标检测采用的思路是:首先在图像上提取一系列的候选区域,然后将候选区域输入到网络中修正候选区域的边框以定位目标,对候选区域进行分类以识别.虽然,在Faster R-CNN中利用 ...
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...