文档章节

列表复制详解

o
 osc_4nmshwhm
发布于 2018/08/07 11:10
字数 835
阅读 0
收藏 0

非复制但内容一致的情况

首先生成列表list1,list2,查看其中内容,对内容做比较,对内存id做比较:

list1 = list(range(5))
list2 = list(range(5))
print(list1)
print(list2)
print(list1 == list2)
print("list1 ID:",id(list1))
print("list2 ID:",id(list2))

输出结果为:

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
True
list1 ID: 2402197214728
list2 ID: 2402197214856

依输出结果可见,两个列表只是都迭代了range(5),内容一致,但内存地址不同,相互独立。

 

列表赋值复制

生成列表list1,将list3赋值等于list1,对内容做比较,对内存id做比较:

list1 = list(range(5))
list3 = list1
list3[1] = 8
print(list3)
print(list1)
print("list1 ID:",id(list3))
print("list2 ID:",id(list1))

输出结果为:

[0, 8, 2, 3, 4]
[0, 8, 2, 3, 4]
list1 ID: 2439749211784
list2 ID: 2439749211784

依输出结果可见,当list3赋值等于list1时,当对任意一列表进行修改时,另外一个列表同时被修改,原因是两个列表所调用的内存地址相同,两个入口同时指向同一内存地址,与linux文件系统的硬链接相似。

 

for循环迭代追加复制

生成空列表list4,将list2中的内容使用for循环迭代追加至list4,对内容做比较,对内存id做比较:

list2 = list(range(5))
list4 = []

for _ in list2:
    list4.append(_)

print(list2)
print(list4)
print(list2 == list4)
print("list2 ID:",id(list2))
print("list4 ID:",id(list4))

输出结果为:

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
True
list2 ID: 1698948945544
list4 ID: 1698948944392

依输出结果可见,for循环迭代复制后的list4和list2内容一致,但内存地址不同,list只是复制了list2中的内容,但两者相互独立。

 

列表的浅copy复制(shadow copy)

将列表list6对list5进行浅copy,对内容做比较,对内存id做比较:

list5 = [1,2,"qwer",[5,6]]

list6 = list5.copy()

print(list5)
print(list6)
print(list5 == list6)
print("list5 ID:",id(list5))
print("list6 ID:",id(list6))

list5[3][0] = 'asdf'
print(list5)
print(list6)
print(id(list5[-1]))
print(id(list6[-1]))

输出结果为:

[1, 2, 'qwer', [5, 6]]
[1, 2, 'qwer', [5, 6]]
True
list5 ID: 3016971798152
list6 ID: 3016972669320
[1, 2, 'qwer', ['asdf', 6]]
[1, 2, 'qwer', ['asdf', 6]]
3016972669448
3016972669448

依输出结果可见,list6对list5 进行浅copy后,两个列表内容一致,内存地址不相同。但当对list5中的引用类型进行修改后,list6中的同时也被修改了,原因是进行浅copy操作后,list6和list5的引用类型内存地址一样,所以对list5修改时,list6也被修改。

 

列表的深copy复制

将列表list7对list8进行深copy,需要import copy模块。对内容做比较,对内存id做比较:

import copy

list7 = [1,2,"qwer",[5,6]]

list8 = copy.deepcopy(list7)

print(list7)
print(list8)
print(list7 == list8)
print("list7 ID:",id(list7))
print("list8 ID:",id(list8))

list7[3][0] = 'asdf'
print(list7)
print(list8)
print(id(list7[-1]))
print(id(list8[-1]))

输出结果为:

[1, 2, 'qwer', [5, 6]]
[1, 2, 'qwer', [5, 6]]
True
list7 ID: 1797818246088
list8 ID: 1797818247368
[1, 2, 'qwer', ['asdf', 6]]
[1, 2, 'qwer', [5, 6]]
1797818245896
1797818247304

依输出结果可见,list8对list7进行深copy后,两个列表内容一致,内存地址不相同。当对list7中的引用类型进行修改后,list8并没有被修改,list7和list8的引用类型内存地址不一样。list7和list8内容一致,但完全独立。

如果想让copy对象与原列表真正的完全不同,就需要用到深copy

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

树莓派4b + Ubuntu20.04 Server 安装Java8

安装环境: 树莓派4b + Ubuntu20.04 Server 32位 1. 下载jdk https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2. 解压 tar -zxvf jdk-8u251-linux-arm32-vf......

SummerGao
33分钟前
9
0
项目实战:Qt+OpenCV图像处理与识别算法平台

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
35分钟前
7
0
北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解 道翰天琼认知智能api机器人接口。

医疗事关人身安全,要求极高,容错率极低,因此,知识壁垒和技术壁垒都很高。过去,AI系统更多的是服务于终端,辅助医生诊断、决策。但是,医疗很复杂,直接切入终端问题很多。未来十年,AI+...

jackli2020
39分钟前
11
0
源于HystrixCommandStartStream和RollingCommandMaxConcurrencyStream 的 RxJava demo

其实,最近在工作之余看Hystrix源代码已经有一个多月了, 除了对 HystrixCommandProperties ,HystrixCommand 和AbstractCommand 几个类比较了解以外,其余看山不是山,比较懵, 主要是因为H...

专业写BUG的程序员
42分钟前
16
0
聊聊Java中的异常及处理

前言 在编程中异常报错是不可避免的。特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时。今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常...

良许Linux
46分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部