`
禹爸爸
  • 浏览: 86301 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Pytoh随笔之浅拷贝与深拷贝的区别

阅读更多

在Python中,对变量进行赋值操作,实际是一个浅拷贝动作,将赋值号右边的对象引用赋给了赋值号左边的变量。

s = "abcdefg"

如上面这句代码,实际是先创建一个字符串对象,内容为abcdefg,然后将该对象的引用赋给变量s。同样的,如果将s再赋值给另一个字符串变量s1,同样也是将引用赋给s1,所以对s1的修改,会影响s的内容,因为他们是指向同一样内存地址。

对于简单数据类型,浅拷贝和深拷贝是没有区别的。但是对于复杂的数据类型,如列表,字典,类,或是其它自定义的可嵌套的数据类型,浅拷贝和深拷贝还是有区别的,下面以字典类型为例进行说明。

 

import copy

d1 = {"Name":"Chris", "Account":{"RMB": 1000, "USD": 12345}}
d2 = copy.copy(d1)
d3 = dict(d1)
d4 = d1

print [id(x) for x in d1, d2, d3, d4]

d2["Name"] = "Martin" #修改d2中的Name值
d2["Account"]["RMB"] = 2000 #修改d2中的人民币帐户金额
print [x for x in d1, d2, d4] #输出d1, d2, d4内容,d4和d1内容相同,修改d2的人民币帐户金额会影响到d1中的人民币帐户金额
d3["Name"] = "Vivian" #修改d3中的Name值
d3["Account"]["RMB"] = 3000 #修改d3中的人民币帐户金额
print [x for x in d1, d3, d4] #输出d1, d3, d4内容,d4和d1内容相同,修改d3的人民币帐户金额会影响到d1中的人民币帐户金额

d3 = copy.deepcopy(d1)
d3["Name"] = "Vivian" #修改d3中的Name值
d3["Account"]["RMB"] = 6000 #修改d3中的人民币帐户金额
print [x for x in d1, d3, d4] #输出d1, d3, d4内容,d4和d1内容相同,修改d3的人民币帐户金额不会影响到d1中的人民币帐户金额


输出的结果为

[13744000, 13745872, 13746016, 13744000]
[{'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Martin'}, {'Account': {'RMB': 2000, 'USD': 12345}, 'Name': 'Chris'}]
[{'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Vivian'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}]
[{'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}, {'Account': {'RMB': 6000, 'USD': 12345}, 'Name': 'Vivian'}, {'Account': {'RMB': 3000, 'USD': 12345}, 'Name': 'Chris'}]


首先,我们在第3行定义了一个字典变量d1,第4到6行分别用COPY模块中的COPY方法(浅拷贝),工厂方法(dict)和赋值号将赋值给d2,d3和d4。

第8行语句输出这四个变量的内存地址,可以发现,d1和d4指向同一个地址,这证实了我们前面说的,赋值号是对引用进行赋值。

d2和d3有着自己的内存地址且与d1不同,这说明COPY函数和工厂方法(dict)会新开辟内存空间,并将赋值号右边的内容复制到新的内存地址。

第10到15行代码修改变量d2和d3的内容及其子对象(Account是他们的子对象)中的内容,可以发现d2和d3中的Key为Name的值发生了变化,没有影响d1中的值;可是我们修改d2和d3中Key为Account中的RMB的值时,变量d1的RMB值也跟着发生了变化,这说明了执行浅拷贝操作,只是会复制父对象内容,其子对象仍然是引用,也就是说d1,d2和d3中的Account对象是同指向同一个内存地址,所以无论我们是对d2还是d3中的Account进行修改时都会影响到d1中的Account值。如果想让这三个变量中是子对象互不影响,我们就需要用到COPY模块中的deepcopy方法。

第17到20行代码就是使用了deepcopy方法,对d3的子对象修改不会影响到d1的子对象。

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    20210721-国信证券-市场思考随笔之六十四:投资理念,新旧转换,越转越快.pdf

    随着中国股市近来的新情况、新形势和新问题的出现,证券分析师燕翔在国信证券的市场思考随笔中提出了投资理念的转变,并对其进行了深入分析。这四个转变方向分别是:价值投资不等于低估值投资、传统经济周期框架分析...

    教师随笔-初中道德与法治教师随笔5篇.docx

    教师随笔-初中道德与法治教师随笔5篇.docx

    最新小学二年级道德与法治教学随笔.pdf

    最新小学二年级道德与法治教学随笔.pdf

    小学二年级道德与法治教学随笔.docx

    小学二年级道德与法治教学随笔.docx

    散文随笔【黄牛散文随笔】.rar

    1. **散文与随笔的区别**:散文通常指的是结构自由、形式灵活、语言优美、情感丰富的文学体裁,它强调的是意境和情感的表达;而随笔则更为随意,通常是作者对某一主题的即时感悟,篇幅短小,但富有哲理。 2. **黄牛...

    网恋随笔散文随笔散文.rar

    很抱歉,但根据您给出的信息,标题和描述中提到的是"网恋随笔散文随笔散文.rar",这明显与IT行业知识不相符,而更倾向于文学或个人创作。标签虽为"教育",但没有具体的IT教育相关知识点。压缩包子文件的文件名称列表...

    随笔之十二-高压直流输电系统.doc

    随笔之十二-高压直流输电系统.doc

    基于Java与跨平台技术的crostitch涂鸦随笔设计与实现源码

    本项目是一款基于Java和跨平台技术的crostitch涂鸦随笔设计与实现源码,包含65个文件,其中包括30个Java源文件、16个PNG图片文件、7个JavaScript文件、2个XML文件、1个Git忽略文件、1个Markdown文件、1个Maven项目...

    散文随笔【人间五月散文随笔】.rar

    【标题解析】 "散文随笔【人间五月散文随笔】.rar" 这个标题表明这是一...综上所述,这个压缩包提供了一本以"人间五月"为主题的散文随笔集,不仅供读者欣赏文学之美,还具有教育价值,可作为教育资源应用于教学活动中。

    信息技术教学随笔.doc

    鉴于目前常用的Windows 10和XP系统之间的差异,教师让学生了解XP系统,然后与Win10进行对比学习,通过实际操作让学生体验和总结不同系统中的操作差异,如在查找文件和文件夹时的步骤区别,以加深学生的理解和记忆。...

    MATHCAD学步随笔

    工程数学软件实用入门资料,可视很好,不需要专门的语言。

    [小忆故乡随笔]故乡随笔.rar

    总的来说,【小忆故乡随笔】通过PDF文档的形式,为读者提供了一次跨越时空的心灵之旅,它不仅仅是一本关于故乡的随笔集,更是一份教育素材,让我们在阅读中感受故乡的气息,理解乡土文化,同时也学习到如何用文字...

    高中随笔,高中随笔200字(3篇).doc

    【标题】与【描述】中提到的文件是一个关于高中写作的资料,包含了三篇不同主题的随笔。这些随笔分别是以“一草一木总关情”、“使命”和“心灵不会是一块闲置的空地”为话题展开的。通过分析文章内容,我们可以提取...

    一年级上册道德与法治教学随笔.docx

    3. 提高课堂教学质量:提高教学质量的关键之一是实施教学质量分析制度,通过课堂反馈、课后练习和形成性测试,了解学生对知识的掌握程度,发现问题并制定改进措施,持续优化教学效果。 4. 教育心理学的应用:引用...

    教师随笔-小班教师政治随笔5篇.docx

    - **保育与教育并重**:幼儿园的工作不仅要关注儿童的保育需求,如饮食、卫生等,还要注重教育质量,通过多样化的活动促进儿童各方面能力的发展。 ### 4. 关注个别差异 - **尊重个体差异**:每个孩子都是独一无二...

    关于描写夏天的散文随笔.doc

    关于描写夏天的散文随笔.doc

    人生随笔六篇,感悟人生的散文随笔精选.doc

    【标题】:人生随笔六篇 - 感悟...总结:这六篇随笔深入浅出地阐述了人生的种种感悟,提醒读者关注内心世界,珍视简单的幸福,并以积极的心态面对生活中的挑战。通过比喻和故事,传递了积极向上的人生态度和生活智慧。

    Java完整随笔(学习)

    4. **数组与集合框架**:Java提供了丰富的数组和集合类,如ArrayList、LinkedList、HashSet、HashMap等,以及它们的操作和适用场景。 5. **字符串处理**:String类在Java中是不可变的,笔记可能涵盖了字符串的创建...

    一年级数学第一学期教学随笔.pdf

    一年级数学第一学期教学随笔.pdf

    关于小学一年级数学下册教学随笔.docx

    关于小学一年级数学下册教学随笔.docx

Global site tag (gtag.js) - Google Analytics