浅copy:
list1=['zhangsan','lisi','wangwu','zhaoliu']list2=list1.copy()# copy之后给list2一个新的地址print('list1pop前',id(list1))#list1pop前 1442331619456print('list2pop前',id(list2))#list2pop前 1442331620416print(list1,list2)list2.pop()#上一节说过,列表是可变类型,从list2删除一个元素,list2的地址不会改变print('list1pop后',id(list1))#list1pop后 1442331619456print('list2pop后',id(list2))#list2pop后 1442331620416print(list1,list2)
对于list2的修改操作,更不会影响list1
这个类似你从D盘copy一个文件到E盘,不论你在E盘如何修改copy过去的文件,对于源文件没有任何影响 。
文章插图
浅copy:
可变类型:公用一个地址,修改里面的内容,但是地址不会改变
不可变类型:开始内容一样,地址一样;内容如果发生变化,地址跟着变化
如下所示:
我们修改列表里面index 3指向列表里面的一个列表
list3[2].Append(100)
list2[2].append(100)
list1[2].append(100)
列表里面的列表是可变类型,修改里面的内容,但是内存地址没有变,
因此打印出来的三个list指向的内容都存在修改后的100.
文章插图
文章插图
文章插图
下面的例子,修改的是list列表里面的index0,str字符串是不可变类型,
只要修改了里面的内容,地址随着改变 。
修改list3[0],那么list3[0]的地址发生了改变,list3[0]的内容跟随一起改变 。
但是list1[0]和list2[0]指向 的地址并没有发生改变,因此他的内容还是张三 。
这个如果还不是特别明白,可以翻看上一篇,可变和不可变
文章插图
文章插图
文章插图
深度copy和浅copy,仔细对比修改之后的地址
import copylist1=['张三','李四',[1,2,3,4]]list2=copy.deepcopy(list1)list2[2].append(100)print('list1'+'*'*10)for i in list1:# 采用for循环看清楚一点各个地址print(i,id(i))print('list2'+'-'*10)for i in list2:print(i,id(i))
文章插图
深度copy
文章插图
浅copy
深度copy的时候,list 里面的可变list地址 是不一样的;
浅copy的时候,list 里面的可变list地址 是一样的;
这样的话,深度copy的地址不一样,那么再次修改list里面的可变list,修改list2不会影响list1
同理修改list1 不会影响list2
文章插图
这个一定一定要亲自去敲一下代码,打开文章,你看懂了,关闭文章你就不知道咋回事!
切勿眼高手低!敲一下去,理会一下!
【python的浅copy和深copy】
推荐阅读
- Python构建代理池,突破IP的封锁爬取海量数据
- Python基础编程——标准库之random模块
- Python-快速添加headers请求头
- 用于数据科学的六种必备Python工具
- Python 增强视频画质,就这么做
- Python 图像处理
- Python中的条件选择和循环语句
- 整理的一些在使用Python中常用网页字符串处理方法
- 一文搞懂Python中的核心概念:导入,模块,包
- Python八种数据导入方法,你掌握了吗?