Python列表中的列表列表

时间:2013-02-24 01:57:37

标签: python list multidimensional-array

我正在使用Python中的Flask框架,需要将列表列表移交给渲染器。

我逐步完成循环并创建一个列表,对其进行排序,将其附加到另一个列表,然后使用主列表调用render函数,如下所示:

for itemID in itemsArray:
    avgQuantity = getJitaQuantity(itemID)
    lowestJitaSell = getJitaLowest(itemID)
    candidateArray = findLowestPrices(itemID, lowestJitaSell, candidateArray, avgQuantity)
    candidateArray.sort()
    multiCandidateArray.append(candidateArray)
renderPage(multiCandidateArray)

我的问题是我需要清除candidateArray并每次通过循环创建一个新的,但看起来我追加到multiCandidateArray的candidateArray实际上是一个指针,而不是值本身。

当我这样做时:

for itemID in itemsArray:
    avgQuantity = getJitaQuantity(itemID)
    lowestJitaSell = getJitaLowest(itemID)
    candidateArray = findLowestPrices(itemID, lowestJitaSell, candidateArray, avgQuantity)
    candidateArray.sort()
    multiCandidateArray.append(candidateArray)
    **del candidateArray[:]**
renderPage(multiCandidateArray)

我最终没有任何价值观。

有没有办法处理我错过的这种情况?

2 个答案:

答案 0 :(得分:0)

我可能会选择以下内容:

for itemID in itemsArray:
    avgQuantity = getJitaQuantity(itemID)
    lowestJitaSell = getJitaLowest(itemID)
    candidateArray = findLowestPrices(itemID, lowestJitaSell, candidateArray, avgQuantity)
    multiCandidateArray.append(sorted(candidateArray))

此处无需del任何内容,sorted会返回新的list,因此即使FindLowestPrices由于某种原因返回对同一列表的引用(即不太可能),那么你在multiCandidateArray中仍然会有唯一的列表(尽管你的唯一列表可以保存对相同对象的引用)。

答案 1 :(得分:0)

您的代码已经每次都会在循环中创建一个新代码。

candidateArray = findLowestPrices(...)

这会为变量candidateArray分配一个新列表。它应该工作正常。

执行此操作时:

del candidateArray[:]

...您正在删除刚刚附加到主列表中的相同列表的内容。

不要考虑指针或变量;只考虑一下对象,并记住Python中的任何内容都不会被隐式复制。列表是一个对象。在循环结束时,candidateArray将与multiCandidateArray[-1]相同的列表对象命名为。对于同一件事,它们是不同的名称。在下一次循环运行时,candidateArray将成为findLowestPrices生成的 new 列表的名称,并且主列表末尾的列表不受影响。< / p>

written about this before;将变量视为预定内存块的C方式根本不适用于Python。将名称移动到值,而不是将值复制到某些固定数量的存储桶中。

(另外,挑剔,但Python代码通常使用under_scores,并且不会打扰名称中的类型,除非它真的含糊不清。所以你可能有candidatesmulti_candidates。绝对不要不要把任何东西称为“数组”,因为标准库中有一个array模块可以做一些不同的事情,通常不太有用。:))