深拷贝、浅拷贝、copy、deepcopy
针对于深拷贝和浅拷贝的问题,做了一下实验帮助理解
代码
import copy
s1 = [11, 22]
s2 = [33, 44]
a = [11, 22]
print(r'赋值符号在python里面是‘指向’的意思,共用同一个内存地址')
a = s1
print('{}: {},id: {}'.format('a', a, id(a)))
print(r'浅拷贝只是拷贝了最外层的东西,所以地址发送变化')
b = copy.copy(a)
print('{}: {},id: {}'.format('b', b, id(b)))
print(r'深拷贝是从头到尾全部拷贝,所有的地址均发生变化')
c = copy.deepcopy(a)
print('{}: {},id: {}'.format('c', c, id(c)))
print('\n\n')
print(r'列表指向的情况下,可以看出深拷贝和浅拷贝的区别')
s12 = [s1, s2]
print('{}: {},id: {}'.format('s12', s12, id(s12)))
bb = copy.copy(s12)
cc = copy.deepcopy(s12)
print('{}: {},id: {}'.format('bb', bb, id(bb)))
print('{}: {},id: {}'.format('cc', cc, id(cc)))
print('{}: {},id: {}'.format('bb[0]', bb[0], id(bb[0])))
print('{}: {},id: {}'.format('cc[0]', cc[0], id(cc[0])))
print('\n\n')
print(r'注意(坑):')
print(r'元组元素为常量时,浅/深拷贝无效;元组元素为变量/地址时,深拷贝有效')
ss_tuplt = (11, 22)
d = copy.copy(ss_tuplt)
e = copy.deepcopy(ss_tuplt)
print('{}: {},id: {}'.format('d', d, id(d)))
print('{}: {},id: {}'.format('e', e, id(e)))
ss_tuplt = (s1, s2)
d = copy.copy(ss_tuplt)
e = copy.deepcopy(ss_tuplt)
print('{}: {},id: {}'.format('d', d, id(d)))
print('{}: {},id: {}'.format('e', e, id(e)))
print(r'切片相当于浅拷贝')
s1 = [1, 2, 3, 4]
s2 = s1[:]
print('{}: {},id: {}'.format('s1', s1, id(s1)))
print('{}: {},id: {}'.format('s2', s2, id(s2)))
print('{}: {},id: {}'.format('s1[0]', s1[0], id(s1[0])))
print('{}: {},id: {}'.format('s2[0]', s2[0], id(s2[0])))
运行截图
结论
在更改值的时候需要考虑是否会影响同样指向该地址的变量(浅拷贝);
在做测验的时候需要考虑是否会污染数据源(深拷贝)。