python学习笔记——浅拷贝与深拷贝

见网易云课堂“疯狂的python”第31章

浅拷贝与深拷贝需调用模块:
import copy
浅拷贝是对引用的拷贝(只拷贝父对象)
深拷贝是对对象的资源的拷贝
import copy #调用copy模块
a=[1,2,3,[‘a’,’b’,’c’],u] #列表a
b=a
这时id(a)与id(b)地址完全相同,而且列表a与列表b里的任何一个子项的地址也完全相同,当a列表做任何变化时,b也会跟着变化。
浅拷贝举例:
b=copy.copy(a)
这时id(a)与id(b)地址并不相同,但是二者的里的任何一个子项的地址是完全相同的,比如id(a[3])与id(b[3])完全相同。
a.append(‘8’) #a列表添加元素8
此时a的值为a=[1,2,3,[‘a’,’b’,’c’],u,8]
而b的值并没有跟着变化,依旧为b=[1,2,3,[‘a’,’b’,’c’],u]
这就意味着b是对a父项的拷贝。
在python中,变量可分为可变变量与不可变变量,数字和字符串占属于不可变变量,有固定的地址,当数字与字符串改变时地址也会跟着变化。
例如a[0]=3时,a变为[3,2,3,[‘a’,’b’,’c’],u,8] ,此时a[0]的地址较原来a[0]为1时的地址就变了。
但是列表中的子列表a[3]做为一个可变变量,整个子列表分配的地址是恒定的,且与c[3]的地址完全相同,因此当a[3]添加或减少一个元素时,比如a[3].append(‘d’),b对象也会跟着同步变化。
故要使b对a做一个彻底复制,使二者子项都分配有不同的地址,就需要用到:copy.deepcopy()函数
b=copy.deepcopy(a)
此时二者父项与任意子项的地址都不一样,无论a怎么变化,b都不再跟着变化。
浅拷贝与深拷贝的关系可参见下图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值