我正在使用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)
我最终没有任何价值观。
有没有办法处理我错过的这种情况?
答案 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
,并且不会打扰名称中的类型,除非它真的含糊不清。所以你可能有candidates
和multi_candidates
。绝对不要不要把任何东西称为“数组”,因为标准库中有一个array
模块可以做一些不同的事情,通常不太有用。:))