Python基础笔记(六)深拷贝与浅拷贝

1456-张同学

发表文章数:22

热门标签

首页 » Python » 正文

定义:

浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用;

深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象;

import copy
a = [1,2,3,[4,5]]
b = copy.copy(a)
print(id(a), '###',id(b))
print(a, '###', b, '###', id(b[3]))

b[3].append(6)
print(a, '###', b, '###', id(b[3]))

b.append(7)
print(a, '###', b, '###')

b[1] = 99
print(a, '###', b, '###')

Python基础笔记(六)深拷贝与浅拷贝

上图是对浅拷贝的对象进行修改,及修改后的结果,可以看到,修改b的子对象中的列表时,源对象中的子对象也会发生改变,这是因为对象a和b的列表子对象都是对列表[4,5]的引用(地址?),而列表是一个可变对象,当对一个可变对象进行修改时,会在原对象(原地址)进行修改,因此a和b中的列表对象都发生了修改;

那么,为什么增加b中的对象时,a中不增加呢,这是因为a和b是不同的对象(它们只是包含了相同的引用,但它们本身是不同的对象),对于学过C语言的同学可以这样理解:a和b是两个指针类型的数组,它们存储的指针相同,因此为b增加一个对象的引用(指针)时,a中不会增加这个引用;但对b的一个引用(指针)指向的子对象(同样也是数组)增加一个引用(整数)时,a中会发生同样的改变,这是因为a和b中的这个引用相同(指针相同),指向相同的对象;

那么,为什么对b中的对象b[1]进行修改时,a[1]不会发生变化呢?这是因为Python中,整数是不可变的对象,a[1]、b[1]在开始时都是对整数2这个对象的引用,整数2这个对象在占用了一块内存之后,该块内存不能被赋予其他值,对b[1]进行赋值时,其实是在另一块内存新建了一个整数99的对象,并让b[1]指向该对象,此时b[1]和a[1]指向不同的对象了,所以a[1]不会发生修改;

综上,浅拷贝是拷贝子对象的引用,若子对象是可变对象,那么子对象的修改也会反应在源对象上,如果子对象不是可变对象,那么由于新建对象的机制,源对象不会发生修改;

相对应地,深拷贝会拷贝子对象的内容,而不仅仅是子对象的引用;

import copy
a = [1,2,3,[4,5]]
b = copy.deepcopy(a)
print(id(a), '###',id(b))
print(a, '###', b, '###', id(b[3]))

b[3].append(6)
print(a, '###', b, '###', id(b[3]))

b.append(7)
print(a, '###', b, '###')

b[1] = 99
print(a, '###', b, '###')

Python基础笔记(六)深拷贝与浅拷贝

无论如何修改b的内容,a的内容都不会发生改变

标签:

未经允许不得转载:作者:1456-张同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Python基础笔记(六)深拷贝与浅拷贝》 发布于2020-12-13

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录