我正在使用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并创建一个新的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)
我最终没有价值观。你知道吗
有没有办法处理我所缺少的这种情况?你知道吗
我可能会说:
在这里不需要
del
任何内容,并且sorted
返回一个新的list
,因此即使FindLowestPrices
出于某种原因返回对同一列表的引用(这不太可能),那么multiCandidateArray
中仍然有唯一的列表(尽管您的唯一列表可以包含对相同对象的引用)。你知道吗您的代码已经每次通过循环都会创建一个新代码。你知道吗
这将为变量
candidateArray
分配一个新列表。它应该很好用。你知道吗当您这样做时:
…您正在删除刚刚附加到主列表的同一列表的内容。你知道吗
不要考虑指针或变量;只考虑对象,记住Python中没有任何东西是隐式复制的。列表是一个对象。在循环的末尾,
candidateArray
将同一列表对象命名为multiCandidateArray[-1]
。对于同一件事,他们的名字不同。在循环的下一次运行中,candidateArray
成为由findLowestPrices
生成的新列表的名称,并且主列表末尾的列表不受影响。你知道吗我已经written about this before;将变量看作预先确定的内存块的C方式根本不适用于Python。名称被移到值上,而不是将值复制到固定数量的存储桶中。你知道吗
(还有,吹毛求疵,但是Python代码通常使用
under_scores
,并且不需要处理名称中的类型,除非它真的很模糊。所以你可能有candidates
和multi_candidates
。绝对不要将任何东西称为“array”,因为标准库中有一个array
模块,它做了一些不同的事情,通常不太有用。:))相关问题 更多 >
编程相关推荐