列表的深浅复制

项目场景:

编写hill密码时遇到嵌套列表


问题描述

在计算模逆矩阵时需要计算矩阵的代数余子式,我在复制一个新列表并删除对应的行和列时,出现了列表二次使用时报错。


原因分析:

嵌套列表需要考虑深浅复制

  • 如果是嵌套列表,那么复制列表时,用普通的copy复制列表,改变原列表或者新列表,其对应的新列表和原列表也会被改变
  • 在复制嵌套列表时需要用copy模块

具体演示:

没有嵌套列表时,复制列表不用考虑深浅复制

lis1=[1,2,3,4,5]
lis2=lis1.copy() # 浅复制
#改变lis1不会影响2

在嵌套列表下:

l=[[1,2,3],[3,4,5]]
l1=l
j=1
for i in range(len(l)):
    l[i].pop(j)
l.pop(0)
print('l=',l)
print('l1=',l1)

这是打印结果,我们可以看到,改变原列表时,新列表也被改变了。这是因为存在嵌套列表时,我们复制新列表其实是复制的最里面的列表的地址。感兴趣的读者可以使用id去查看嵌套列表的地址,可以发现浅复制后的两个列表内的嵌套列表地址是一样的
在这里插入图片描述


解决方案:

使用copy模块进行深复制

import copy

l=[[1,2,3],[3,4,5]]
j=1
l1=copy.deepcopy(l)
for i in range(len(l)):
    l[i].pop(j)
l.pop(0)
print(l1)
print(l)

使用copy模块进行深复制后,改变新旧列表,另一个列表都不会受影响
在这里插入图片描述


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值