Python 列表复制

Python 列表复制

 

关于Python 列表的复制,有多种方法,常用的 有 赋值、切片、list、copy,copy.deepcopy等。

但是 实际用时 又有区别,不小心可能就用错了。

接下来 简单举例 说明一下 使用

 

import  copy

a = [1,2,3,4]
b = a
c = a[:]
d = a.copy()
e = copy.copy(a)
f = copy.deepcopy(a)
g = list(a)
print('id(a):%d,id(b):%d' % (id(a),id(b)))print('id(c):%d' % (id(c)))
print('a:%s,b:%s,c%s'%(a,b,c))
a[2] = 5
del a[3]
print('a:%s,b:%s,c%s'%(a,b,c))
print('id(d):%d' % (id(d)))
print('d:%s' % d)
print('id(e):%d' % (id(e)))
print('e:%s' % e)
print('id(f):%d' % (id(f)))
print('f:%s' % f)
print('id(g):%d' % (id(g)))
print('g:%s' % g)

执行 结果如下

id(a):4409071368,id(b):4409071368
id(c):4409070344
a:[1, 2, 3, 4],b:[1, 2, 3, 4],c[1, 2, 3, 4]
a:[1, 2, 5],b:[1, 2, 5],c[1, 2, 3, 4]
# 以上可知 a、b id 一致,改变a 则 b 也会改变
# 一下 id 则都不相同 
id(d):4408193736
d:[1, 2, 3, 4]
id(e):4409091336
e:[1, 2, 3, 4]
id(f):4409091400
f:[1, 2, 3, 4]
id(g):4409091080
g:[1, 2, 3, 4]

 

换一种 内嵌列表的列表复制

names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"]
# 复制一份列表
names2 = names.copy()
# 把李四 改成英文
names[2][1] = "Lisi"
print(names)
print(names2)
# 执行结果
['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']
['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']

这段代码的运行结果是,两个列表的李四都变成了英文,来分析一下原理

其实这个图也挺简单的,就是中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的names2 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。

也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。

补充:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用 

 

实现浅复制的三种方法

 

import copy

names = ["小明", "小红", "小黑", "小黄", "小白"]
# 浅copy 1.
names1 = copy.copy(names)
# 2.
names2 = names[:]
# 3. 工厂函数
names3 = list(names)

 

深复制的方法 

 

import copy

names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"]
# 深复制
deep_names = copy.deepcopy(names)
# 修改粉色为 Pink
names[3][0] = "Pink"
# 分别打印输出两个列表
print(names)
print(deep_names)
# 输出结果为:

['小明', '小红', '小黑', ['Pink'], '小黄', '小白']
['小明', '小红', '小黑', ['粉色'], '小黄', '小白']

 

如下例

a = [[10], 20]
b = a[:]
c = list(a)
d = a * 1
e = copy.copy(a)
f = copy.deepcopy(a)
a.append(21)
a[0].append(11)

print (id(a), a)
# 4317123656 [[10, 11], 20, 21]
print (id(b), b)
# 4317123592 [[10, 11], 20]
print (id(c), c)
# 4317123848 [[10, 11], 20]
print (id(d), d)
# 4317082888 [[10, 11], 20]
print (id(e), e)
# 4317123720 [[10, 11], 20]
print (id(f), f)
# 4317123784 [[10], 20]

 

转载于:https://www.cnblogs.com/BlueSkyyj/p/10319421.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值