深浅拷贝

女朋友问我深浅copy到底是什么?-LMLPHP

列表存放值的时候,是先申请一块内存空间,存放索引和内存地址的对应关系,其实通俗的来说列表内不存真正的值,是一种间接存放的对应关系;

  • 列表内存不可变类型的数据

女朋友问我深浅copy到底是什么?-LMLPHP

就比如说,如果现在将L列表索引0位置的值修改为66,那么这个过程发生了什么?通俗理解为去L[0]去值11的路被销毁了,现在通往了值66,那么这个对应关系就修改了,再次索引出来的L[0]就是66

女朋友问我深浅copy到底是什么?-LMLPHP

不管是一维的还是二维的道理都是如此;

女朋友问我深浅copy到底是什么?-LMLPHP

浅拷贝

l = [11,22,['xx','yy']]
'''l列表是二维的,列表套列表的结构'''

# 浅拷贝
new_l = [:]
# 修改原列表
l[2][0] = 'zz'
print('新列表',new_l) # 新列表 [11,22,['zz','yy']]
print('源列表',l)    # 原列表 [11,22,['zz','yy']]
print(id(l[0]),id(l[1]),id(l[2]))   # 1627619440 1627619472 2225456877448
print(id(new_l[0]),id(new_l[1]),id(new_l[2]))  # 1627619440 1627619472 2225456877448
'''
总结:不论修改原列表还是新列表,修改列表内的不可变类型元素不会对原列表或新列表造成影响,如果修改的是列表内的可变类型元素,那么原列表或新列表会随着修改而修改
原理:拷贝对于不可变类型来说拷贝的是值,但是拷贝对于可变类型元素来说拷贝的是对应关系,可以通过查看原列表和新列表的id值来验证,id值是一样的
'''

总结:不论修改原列表还是新列表,修改列表内的不可变类型元素不会对原列表或新列表造成影响,如果修改的是列表内的可变类型元素,那么原列表或新列表会随着修改而修改

原理:拷贝对于不可变类型来说拷贝的是值,但是拷贝对于可变类型元素来说拷贝的是对应关系,可以通过查看原列表和新列表的id值来验证,id值是一样的

女朋友问我深浅copy到底是什么?-LMLPHP

女朋友问我深浅copy到底是什么?-LMLPHP

深拷贝

导入:from copy import deepcopy

from copy import deepcopy
l = [11,22,['xx','yy']]
new_l = deepcopy(l)
print(l,id(l))  # [11, 22, ['xx', 'yy']] 1305767841288
print(new_l,id(new_l))  # [11, 22, ['xx', 'yy']] 1305767841352
print(id(l[0]),id(l[1]),id(l[2]))  # 1627619760 1627620112 2688776670984
print(id(new_l[0]),id(new_l[1]),id(new_l[2]))  # 1627619760 1627620112 2688776669256

'''
列表的id值不一样就代表着这两个列表是不同的列表,两个完全不一样的对象,子列表也是一样
'''
'''不可变类型的id还是一样,不可变类型的id就不一样了,那么列表就相当于造了一个新的列表了'''

女朋友问我深浅copy到底是什么?-LMLPHP

现在再修改哪个值都不会对原列表或新列表有影响现在修改值只需修改对应关系再指向新值就可以了

女朋友问我深浅copy到底是什么?-LMLPHP

03-22 22:27