您的位置:首页 > 编程语言 > Python开发

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

2017-02-26 21:45 330 查看
见网易云课堂“疯狂的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都不再跟着变化。

浅拷贝与深拷贝的关系可参见下图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 对象 网易