浅拷贝只会使列表的id地址发生改变,则一个列表的变化不会影响另一个列表的变化,但是子列表的id并没有被改变,因此,子列表的值会随着一个列表的变化而变化。浅拷贝可以使用copy()函数、或者copy模块的copy()函数。
深拷贝会使列表的id地址发生改变,则一个列表的变化会影响另一个列表的变化,而且子列表的id也会被改变,因此,一个列表的子列表中值的变化,并不会影响另一个列表的子列表。深拷贝只能使用copy模块的deepcopy()函数。
通过如下代码可以充分反映深拷贝和浅拷贝的区别,以及引用的区别。
'''
---** coding by utf-8 **---
作者:hui
时间:2020年-08月-11日
'''
import copy
a=[10,20,30,['zhangsan','lisi']]
b=a
#此时a,b两个列表指向同一片内存地址,子列表也指向同一片内存地址,a,b列表是一个东西
print(a)
print(id(a))#26887272
print(id(b))#26887272
print(id(a[3]))#26888152
print(id(b[3]))#26888152
c=copy.copy(a)#浅拷贝所生成的对象的Id不同,但是子列表的id相同,因此,修改a会影响c,但是修改a的子列表,c的子列表也会发生变化
d=copy.deepcopy(a)#深拷贝所生成的对象的Id不同,子列表的id也不相同,因此,修改a会影响c,修改a的子列表,c的子列表不会发生变化
a.append(80)
a[3].append("yishan")
print(c)#[10, 20, 30, ['zhangsan', 'lisi', 'yishan']]
print(id(c))#15910832
print(id(c[3]))#26888152
print(d)#[10, 20, 30, ['zhangsan', 'lisi']]
print(id(d))#26887592
print(id(d[3]))#26888192