0

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

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

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)

我最终没有价值观。

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

4

2 回答 2

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(尽管你的唯一列表可以包含对相同的对象)。

于 2013-02-24T02:01:04.757 回答
0

您的代码每次都通过循环创建一个新的

candidateArray = findLowestPrices(...)

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

当你这样做时:

del candidateArray[:]

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

不要考虑指针或变量;想想对象,记住 Python 中没有任何东西是隐式复制的。列表是一个对象。在循环结束时,candidateArray将相同的列表对象命名为multiCandidateArray[-1]. 它们是同一事物的不同名称。在下一次循环运行时,candidateArray成为由 生成的列表的名称findLowestPrices,并且主列表末尾的列表不受影响。

我以前写过这个;C 将变量视为预先确定的内存块的方式根本不适用于 Python。名称被移动到值上,而不是值被复制到某个固定数量的桶中。

(Also, nitpicking, but Python code generally uses under_scores and doesn't bother with types in names unless it's really ambiguous. So you might have candidates and multi_candidates. Definitely don't call anything an "array", since there's an array module in the standard library that does something different and generally not too useful. :))

于 2013-02-24T02:03:30.763 回答