深复制浅复制均会重新分配一块内存地址,其区别在于深复制会递归遍历为每层都分配一个新的地址,而浅复制只分配最外层地址。但不可变类型(如string、tuple、int)的均不会重新分配地址
1、浅复制例子说明
import copy
a = [1,[2,3]]
b = copy.copy(a)
b[0] ='z'
b[1][0] ='two'
print(id(a),id(b))
print(id(a[1]),id(b[1]))
print(a,b)
结果如下:
17764040 17404360
17871368 17871368
[1, ['two', 3]] ['z', ['two', 3]]
浅复制a和b内存地址不同,其内层列表[2,3]地址相同,改变b外层值不会影响a,而改变内层值a和b的内层值都会改变,因为它们指向同一个地址
2、深复制例子说明
import copy
a = [1,[2,3]]
b = copy.deepcopy(a)
b[0] = 'z'
b[1][0] = 'two'
print(id(a),id(b))
print(id(a[1]),id(b[1]))
print(a,b)
结果如下:
17895112 17894792
18003592 18002824
[1, [2, 3]] ['z', ['two', 3]]
深复制最外层列表和内层列表的地址均重新分配,改变a或b的值不会相互影响
3、不可变类型
import copy
a = '123456'
b = copy.copy(a)
c = copy.deepcopy(b)
print(id(a),id(b),id(c))
结果如下:
6851248 6851248 6851248
a,b,c均指向同一个内存地址
4、关于赋值
import copy
a = [1,[2,3]]
b = a
b[0] = 'one'
print(id(a),id(b))
print(id(a[1]),id(b[1]))
print(a,b)
结果如下:
17698504 17698504
17806792 17806792
['one', [2, 3]] ['one', [2, 3]]
a和b指向同一内存,b[0] = 'one'即修改该内存里的值,故a也会改变。
import copy
a = '123'
b = a
b = '1'
print(id(a),id(b))
print(a,b)
结果如下:
8088632 4781928
123 1
b ='1'即b指向了另一个地址,并不是改变a指向的地址的值
网友评论