Python深浅copy
深浅copy
先看赋值运算。
a1 = [1,2,3,4,['yy','AA']]
a2 = a1
a1[0] = 111
print(a1)
print(a2)
a1[4][0] = 'bbb'
print(a1)
print(a2)
输出结果
[111, 2, 3, 4, ['yy', 'AA']]
[111, 2, 3, 4, ['yy', 'AA']]
[111, 2, 3, 4, ['bbb', 'AA']]
[111, 2, 3, 4, ['bbb', 'AA']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
2,浅拷贝copy。
a1 = [1,2,3,4,['yy','AA']]
a2 = a1.copy()
print(a1,id(a1))
print(a2,id(a2))
a1[0] = 'yy'
print(a1,id(a1))
print(a2,id(a2))
a1[4][0] = 'yang'
print(a1,id(a1))
print(a2,id(a2))
#输出结果
[1, 2, 3, 4, ['yy', 'AA']] 44025896
[1, 2, 3, 4, ['yy', 'AA']] 44026656
['yy', 2, 3, 4, ['yy', 'AA']] 44025896
[1, 2, 3, 4, ['yy', 'AA']] 44026656
['yy', 2, 3, 4, ['yang', 'AA']] 44025896
[1, 2, 3, 4, ['yang', 'AA']] 44026656
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
3,深拷贝deepcopy。
import copy
a1 = [1,2,3,4,['yy','AA']]
a2 = a1 = copy.deepcopy(a1)
print(a1,id(a1))
print(a2,id(a2))
a1[0] = 'yy'
print(a1,id(a1))
print(a1,id(a2))
a1[4][0] = 'yang'
print(a1,id(a1))
print(a2,id(a2))
输出结果
[1, 2, 3, 4, ['yy', 'AA']] 88299920
[1, 2, 3, 4, ['yy', 'AA']] 88299920
['yy', 2, 3, 4, ['yy', 'AA']] 88299920
['yy', 2, 3, 4, ['yy', 'AA']] 88299920
['yy', 2, 3, 4, ['yang', 'AA']] 88299920
['yy', 2, 3, 4, ['yang', 'AA']] 88299920
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。