第六集:深浅拷贝

'''
'''
1,切片可以应用于:列表、元组、字符串,但不能应用于字典。
2,深浅拷贝,既可应用序列(列表、元组、字符串),也可应用字典。
深浅拷贝的作用:

1,减少内存的使用
2,以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。

浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。深拷贝只能使用copy模块的deepcopy(),所以使用前要导入:from copy import deepcopy
如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。
如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。
'''

 


浅拷贝
'''
# # 简单的拷贝就是把列表拷贝一份
# arrlist = [1,3,4,'s']
# newlist = arrlist.copy()
# # 对新拷贝的列表是可以独立操作的
# del newlist[1]
# print(arrlist,id(arrlist))
# print(newlist,id(newlist))
# 结果 看出来不是一个对象
# [1, 3, 4, 's'] 2209715396544
# [1, 3, 4, 's'] 2209711186752

#多维列表
# 浅拷贝就是你变我也变指向的时同一个地址
# 如果被拷贝的是一个多维列表,对它的多维列表元素操作时,会导致元列表的多维列表元素也发生变化
from copy import copy, deepcopy

varlist = [1,3,2,['a','b','c']]
newlist = varlist.copy()
# del newlist[3][1]
del varlist[3][1]
# print(varlist,len(varlist),id(varlist))
# print(newlist,len(newlist),id(newlist))
# 结果 不同的两个列表
# [1, 3, 2, ['a', 'b', 'c']] 4 1867091796800
# [1, 3, 2, ['a', 'b', 'c']] 4 1867095551360


print(varlist[3],len(varlist),id(varlist[3]))
print(newlist[3],len(newlist),id(newlist[3]))

# =浅拷贝:值相等,地址相等
# copy浅拷贝:值相等,地址不相等二维列表地址相等
# deepcopy深拷贝:值相等,地址不相等

a = [1,2,3]
b=a
print(a,id(a))
print(b,id(b))

cc = [1,2,3]
dd = deepcopy(cc)
del cc[2]
print(cc,id(cc))
print(dd,id(dd))
posted @ 2022-02-25 23:43  冬天里的狐狸  阅读(24)  评论(1编辑  收藏  举报