Python的深拷贝、浅拷贝也是面试经常问的面试题,这里分享一道巩固深浅拷贝的面试题,希望有帮助
import copy
a = [1,2,3,4,5,["a","b","c"]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(100)
a[5].append("d")
print(a)
print(b)
print(c)
print(d)
打印结果:
# a
[1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 100]
#b
[1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 100]
#c
[1, 2, 3, 4, 5, ['a', 'b', 'c', 'd']]
#d
[1, 2, 3, 4, 5, ['a', 'b', 'c']]
b = a :
是赋值,python中赋值传递的是对象的引用,并没有拷贝对象,a改变后,b也为改变后的值
c = copy.copy( a ):
浅拷贝后的内层列表、字典和原来的是共用的,固
a[5].append("d")后,c里面也有d , 外层append(100)不可变数据类型不受此影响
d = copy.deepcopy( a ) :
深拷贝后的内层列表、字典被复制出来,原来的改变,不影响后面的
不明白的话看下面我用PS画的简图
总结几点:
1、复制不可变数据类型,不管copy还是deepcopy,都是同一个地址当浅复制的值是不可变对象(数值,字符串,元组)时和=“赋值”的情况一样,对象的id值与浅复制原来的值相同。
2、复制的值是可变对象(列表和字典)
浅拷贝copy有两种情况:
第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:如上述题目所示,复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。
深拷贝deepcopy:完全复制独立,包括内层列表和字典
python爬虫人工智能大数据