Python:清空循环中使用的临时列表,而不会丢失引用的信息



我有以下类型的数据,我想收集到一个大列表中,以便大列表中的每一行都有以下其中之一(c-d 和 e-f 对应于其中的第二个和第三个(。我的意思是lista_results[0]包括其中的第一个和lista_results[1]第二个等。

(Name)      (Amount-of-points)
Some name   12
Other name  19
...         ...

我有一个循环,它从其他列表中获取信息,然后将其添加到结果列表中。代码如下行:

lista_results = []
lista_temp = []
for y in range(0,10):
    for x in range(0,10):
        lista_temp.append(name_list[y][x], point_list[y][x])
    lista_results.append(lista_temp)
    #lista_temp[:] = []

如果不清空,则每次 x 循环完成时,所有内容都会附加到同一列表中。基本上我得到的是:

[0]["Some name",12]
[0]["Other name",19]
[1]["Some name",12]
[1]["Other name",19]
[1][c,1c]
[1][d,2d]
[2]["Some name",12]
[2]["Other name",19]
[2][c,1c]
[2][d,2d]
[2][e,1e]
[2][f,2f]
...

但我想要的是:

[0]["Some name",12]
[0]["Other name",19]
[1][c,1c]
[1][d,2d]
[2][e,1e]
[2][f,2f]
...

这意味着在将lista_temp附加到lista_results后,我将不得不以某种方式清空。但是当我清空它时(使用 #lista_temp[:] = [](,似乎附加到lista_results的部分也被清空了,或者至少我在尝试打印出 lista_results[0][0][0] 时出现"IndexError"。我假设机器人引用相同的列表并清空其中一个也会清空另一个。

我也尝试了 lista_newtemp=lista_temp,即便如此,我在清空lista_temp后也得到了一个 IndexError。

追加后清空lista_temp而不丢失已追加的先前信息的方法是什么?

(另外,我在这里的第一个问题,我希望我做得好。我希望问题解释清楚。感谢反馈!

从输出样本中很难判断您正在处理哪些数据,但在我看来,您不想清空列表,而是为下一次迭代创建一个新列表。像这样:

lista_results = []
for y in range(0,10):
    lista_temp = []     # we have a new lista_temp for every y
    for x in range(0,10):
        lista_temp.append(something_here)
    lista_results.append(lista_temp)

你看到的行为是因为 Python 通常不会制作隐式副本。附加到lista_results中的每个lista_temp都是同一个对象,而对象又不断变化。

使用列表推导会更 Pythonic。

内部列表 lista_temp 可以像这样创建:

lista_temp = [something_here for x in range(0, 10)]

外部列表 lista_results 可以像这样创建:

lista_results = [make_lista_temp(y)
                 for y in range(0, 10)]

您可以组合它们,并丢失临时变量lista_temp:

lista_results = [[something_here for x in range(0, 10)]
                 for y in range(0, 10)]

编辑:

的主要问题是你没有复制lista_temp,所以lista_results的每个元素都指向lista_temp指向的同一个实例。你可以像这样复制它:

lista_results.append(list(lista_temp))

但是,如上所述,有更好的方法。

最新更新