Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动填充python列表_Python_List - Fatal编程技术网

自动填充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)]
这将生成三个不同的列表