赋值b=a | 只传递对象的引用,b指向对象a的内存地址空间,因此,原有列表a改变的同时,被赋值的b也会做相应的改变。 |
浅拷贝b1=copy.copy(a) | a与b1的内存地址不同,但是子对象的内存地址相同,因此,原始数据改变并不会造成深拷贝里面任何子项的改变 |
深拷贝b2=copy.deepcopy(a) | a与b2的内存地址空间不同,包含子对象的拷贝,所以原始对象的改变并不会造成深拷贝里面的任何子对象的改变 |
当深拷贝和浅拷贝针对的对象全部是不可变数据类型时,两者效果相同;
当深拷贝和浅拷贝针对的对象包含的时可变数据类型时,两者才出现上述区别。
可变数据类型 | 不可变数据类型 |
---|---|
list | 所有数据类型、波尔型、元组、str |
浅拷贝的实现 | 深拷贝的实现 |
---|---|
li.copy( ) 或 li[:] 或 copy.copy( ) | li.deepcopy( ) |
可变数据类型镶嵌可变数据类型
>>> import copy
>>> a = [1,2]
>>> b = [3,4]
>>> c = [a,b]
>>> c
[[1, 2], [3, 4]]
>>> d = copy.copy(c)
>>> id(a)
139939016415712
>>> id(b)
139939016415640
>>> id(c)
139939016463352
>>> id(c[0])
139939016415712
>>> id(c[1])
139939016415640
>>>
>>> id(d)
139939016488360
>>> id(d[0])
139939016415712
>>> id(d[1])
139939016415640
>>> e = copy.deepcopy(c)
>>> e
[[1, 2], [3, 4]]
>>> id(e)
139939016487928
>>> id(e[0])
139939016488216
>>> id(e[1])
139939016415928
不可变数据类型嵌可变数据类型
>>> a
[1, 2]
>>> b
[3, 4]
>>> c = (a,b)
>>> c
([1, 2], [3, 4])
>>> d = copy.copy(c)
>>> d
([1, 2], [3, 4])
>>> e = copy.deepcopy(c)
>>> e
([1, 2], [3, 4])
>>> id(a)
139939016415712
>>> id(b)
139939016415640
>>> id(c)
139939016309792
>>> id(c[0])
139939016415712
>>> id(c[1])
139939016415640
>>> id(d)
139939016309792
>>> id(d[0])
139939016415712
>>> id(d[1])
139939016415640
>>> id(e)
139939016311152
>>> id(e[0])
25703992
>>> id(e[1])
25704064
不可变数据类型嵌不可变数据类型
>>> import copy
>>> a = (1,2)
>>> b = (3,4)
>>> c = (a,b)
>>> d = copy.copy(c)
>>> e = copy.deepcopy(c)
>>> c
((1, 2), (3, 4))
>>> d
((1, 2), (3, 4))
>>> e
((1, 2), (3, 4))
>>> id(a)
139704123841496
>>> id(b)
139704123841568
>>> id(c)
139704123839264
>>> id(c[0])
139704123841496
>>> id(c[1])
139704123841568
>>> id(d)
139704123839264
>>> id(d[0])
139704123841496
>>> id(d[1])
139704123841568
>>> id(e)
139704123839264
>>> id(e[0])
139704123841496
>>> id(e[1])
139704123841568
可变数据类型嵌不可变数据类型
>>> a
(1, 2)
>>> b
(3, 4)
>>> c = [a,b]
>>> d = copy.copy(c)
>>> e = copy.deepcopy(c)
>>> c
[(1, 2), (3, 4)]
>>> d
[(1, 2), (3, 4)]
>>> e
[(1, 2), (3, 4)]
>>> id(a)
139704123841496
>>> id(b)
139704123841568
>>> id(c)
19402336
>>> id(c[0])
139704123841496
>>> id(c[1])
139704123841568
>>> id(d)
19402624
>>> id(d[0])
139704123841496
>>> id(d[1])
139704123841568
>>> id(e)
19322208
>>> id(e[0])
139704123841496
>>> id(e[1])
139704123841568