码迷,mamicode.com
首页 > 编程语言 > 详细

python中的深拷贝与浅拷贝

时间:2018-03-07 23:51:45      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:blog   影响   地址   div   面试题   port   不可变   log   pos   

常见面试题中有深拷贝与浅拷贝的区别;

浅拷贝:只拷贝地址,不拷贝值,两个变量共享同一个对象;
深拷贝:拷贝值,如果列表中也是引用,就递归拷贝;
a = [11,22]
b = [33,44]
c = [a,b]
d = c
id(c)
id(d)

可以看出,c和d的内存地址即ID相同,这是典型的浅拷贝,如果改变a的值,那么c和d都会改变;

import copy
d = copy.deepcopy(c)
id(d)

此时d的ID是不同于c的,而且copy.deepcopy()是递归拷贝的,即改变a、b或者c的值,都不会影响到d,这就是深拷贝;

copy模块中还有一个容易混淆的copy.copy()函数,那么它与copy.deepcopy()有什么不同呢?

e = copy.copy(c)

此时e和c的ID是不同的,如果改变c的值,e不会改变,而如果改变a或b的值,那么e就会相应改变,说明copy.copy()只是深拷贝了第一层,第二层还是浅拷贝;

此时的拷贝对象c是一个可变的列表类型,如果是不可变的数据类型呢?

c2 = (a,b)
e2 = copy.copy(c2)
id(c2)
id(e2)

此时发现c2与e2的地址又是相同的;那么我们可以从中分析出copy.deepcopy()与copy.copy()的拷贝规律,即:

copy.deepcopy()总是深拷贝,支持递归拷贝;
copy.copy()  先判断拷贝类型,如果可变,只深拷贝第一层,不支持递归拷贝;如果不可变(如元组),就浅拷贝。

 

 

python中的深拷贝与浅拷贝

标签:blog   影响   地址   div   面试题   port   不可变   log   pos   

原文地址:https://www.cnblogs.com/chaofan-/p/8525349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!