关于列表嵌套中,给列表固定位置添加元素,结果其余位置均出现元素重复的问题。更详细的描述,列表嵌套,内存地址重复,insert某个元素到位置1,结果位置2-100均出现了此元素

此处有一个3行3列的二维数据组,用的是列表嵌套列表的方法构建

List_1 = [0,0,0]

List_2 = []

for i in range(3):

        List_2.append(List_1)

print(f"0:{List_2}")

print(f"1:{id(List_2[0])}")

print(f"2:{id(List_2[1])}")

print(f"3:{id(List_2[2])}")

>>>

0:[[0,0,0],[0,0,0],[0,0,0]]

1:2627716221632

2:2627716221632

3:2627716221632

用这种方法循环添加(append)同一个列表(List_1 = [])的方式会使得到的嵌套列表List_2中的每一个子列表都有相同的内存地址(id),在这种情况下使用insert对List_2中的指定位置添加元素时,会出现元素重复的情况,示例如下:

我有一个列表A_1 = [10,100],我想将其数据10和100添加到List_2的0号位置子列表1、2位置处,目标是这个样子:List_2 = [[0,10,100],[0,0,0],[0,0,0]],于是我用下方代码进行操作

A_1 = [10,100]

for element_1 in A_1:

        List_2[0].pop()

        List_2[0].insert(1,element_1)

print(f"4:{List_2}")

>>>4:[[0, 100, 10], [0, 100, 10], [0, 100, 10]]

插入的代码没有错,但得到的结果并非目标结果,可以发现10,100加到了每一个子列表中,且是相同位置。这就是上文中创建嵌套列表时每个子列表内存地址(id)相同所导致的。

解决方法

在查找了一些资料后,发现使用copy函数可解决这一问题。

大概得理解就是,在for i in range(3): List_2.append(List_1)中,List_2是重复添加同一个列表,添加三次,此时id也会跟着加过去,如果加上一个copy函数,可能copy在复制的时候会重新给创建一个id,这样就解决了问题,正确处理的代码如下:

List_1 = [0,0,0]

List_2 = []

for i in range(3):

        List_2.append(List_1.copy())

print(f"0:{List_2}")

print(f"1:{id(List_2[0])}")

print(f"2:{id(List_2[1])}")

print(f"3:{id(List_2[2])}")

>>>

0:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
1:2160380019072
1:2160380320512
1:2160380320192

A_1 = [10,100]

for element_1 in A_1:

        List_2[0].pop()

        List_2[0].insert(1,element_1)

print(f"4:{List_2}")

[[0, 100, 10], [0, 0, 0], [0, 0, 0]]

完美解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值