列表的深浅复制

项目场景:

编写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模块进行深复制后,改变新旧列表,另一个列表都不会受影响
在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/m0_62101200/article/details/124586716
今日推荐