此处有一个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]]
完美解决。