[英]A list of lists of lists in 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)
我的問題是,每次循環時我都需要清除候選數組並創建一個新數組,但是看起來我附加到multiCandidateArray的候選數組實際上是一個指針,而不是值本身。
當我這樣做時:
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
模塊標准庫做了一些不同的事情,通常不太有用。:))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.