自动填充python列表
当我创建并填写列表时,会弹出一些奇怪的行为:自动填充python列表,python,list,Python,List,当我创建并填写列表时,会弹出一些奇怪的行为: list1 = [[0,0,0],[0,0,0],[0,0,0]] list2 = [[0]*3]*3 print('lists still look equal here:') print(list1) print(list2) list1[1].pop(1) list2[1].pop(1) print('but not anymore:') print(list1) print(list2) 给我这个输出: lists look comp
list1 = [[0,0,0],[0,0,0],[0,0,0]]
list2 = [[0]*3]*3
print('lists still look equal here:')
print(list1)
print(list2)
list1[1].pop(1)
list2[1].pop(1)
print('but not anymore:')
print(list1)
print(list2)
给我这个输出:
lists look completely equal here:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
but not anymore:
[[0, 0, 0], [0, 0], [0, 0, 0]]
[[0, 0], [0, 0], [0, 0]]
因此,第二个列表从每个小列表中“弹出”,而不仅仅是我正在尝试的列表。我想知道是什么导致了这种行为,如果我需要大量的长列表而不仅仅是这些小列表,是否有一种更优雅的方法来填充可索引列表?当使用操作符
*
时,意味着这些项指向同一个内存位置
因此,当从第一个列表中弹出时,仅删除第一项
当从第二个列表中弹出时,由于列表中的每个元素都指向相同的内存位置,所有元素都会受到影响
看看这个:
list1 = [[0,0,0],[0,0,0],[0,0,0]]
list2 = [[0]*3]*3
for elem in list1:
print (id(elem))
print ('--------')
for elem in list2:
print (id(elem))
输出:
32969912
32937024
32970192
--------
32970752
32970752
32970752
如您所见,第二个列表中的每个元素都有相同的id。这是一个非常常见的错误。在第二个定义中:
list2 = [[0] * 3]*3
这三个子列表在内存中共享相同的引用,因此如果从一个子列表弹出,则从“全部”子列表弹出,因为这三个子列表都指向同一对象
要避免这种情况,请使用:
list2 = [[0] * 3 for _ in range(3)]
这将生成三个不同的列表