Python中的列表列表列表



我正在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)

我最终没有价值观。

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

我可能会选择这样的东西:

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

这里不需要delsorted返回一个新的list,所以即使FindLowestPrices出于某种原因返回对同一列表的引用(这是不可能的),那么multiCandidateArray中仍然有唯一列表(尽管您的唯一列表可以包含对相同对象的引用)。

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

candidateArray = findLowestPrices(...)

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

当你这样做时:

del candidateArray[:]

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

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

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

(还有,挑剔,但Python代码通常使用under_scores,除非名称中的类型真的不明确,否则不会麻烦它。所以你可能有candidatesmulti_candidates。绝对不要把任何东西称为"数组",因为标准库中有一个array模块可以做一些不同的事情,通常不会太有用。:)

相关内容

  • 没有找到相关文章

最新更新