我正在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))
这里不需要del
,sorted
返回一个新的list
,所以即使FindLowestPrices
出于某种原因返回对同一列表的引用(这是不可能的),那么multiCandidateArray
中仍然有唯一列表(尽管您的唯一列表可以包含对相同对象的引用)。
您的代码已经在循环中每次创建一个新代码。
candidateArray = findLowestPrices(...)
这将为变量candidateArray
分配一个新列表。它应该可以正常工作。
当你这样做时:
del candidateArray[:]
您正在删除刚刚附加到主列表的同一列表的内容。
不要考虑指针或变量;只要想想对象,记住Python中没有任何东西是隐式复制的。列表是一个对象。在循环结束时,candidateArray
命名与multiCandidateArray[-1]
相同的列表对象。它们是同一事物的不同名称。在循环的下一次运行中,candidateArray
将成为findLowestPrices
生成的新列表的名称,并且主列表末尾的列表不受影响。
我以前写过这方面的文章;将变量视为预先确定的内存块的C方法根本不适用于Python。名称被移动到值上,而不是将值复制到某个固定数量的存储桶中。
(还有,挑剔,但Python代码通常使用under_scores
,除非名称中的类型真的不明确,否则不会麻烦它。所以你可能有candidates
和multi_candidates
。绝对不要把任何东西称为"数组",因为标准库中有一个array
模块可以做一些不同的事情,通常不会太有用。:)