【问题标题】:A list of lists of lists in PythonPython中的列表列表
【发布时间】:2013-02-24 01:57:37
【问题描述】:

我正在使用 Python 中的 Flask 框架,需要将列表列表交给渲染器。

我逐步循环并创建一个列表,对其进行排序,将其附加到另一个列表,然后使用主列表调用渲染函数,如下所示:

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)

我最终没有价值。

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

【问题讨论】:

    标签: python list multidimensional-array


    【解决方案1】:

    我可能会选择类似的东西:

    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 中有唯一列表(尽管您的唯一列表可以包含对相同对象的引用)。

    【讨论】:

    • 太完美了,非常感谢。用更少的行做我需要的。
    • 实际上,我收回了这一点——如果我运行列表两次,我最终会将第一次运行的值混合到第二组中——如果我运行 3 次,我会得到所有三个。
    【解决方案2】:

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

    candidateArray = findLowestPrices(...)
    

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

    当你这样做时:

    del candidateArray[:]
    

    ...您正在删除刚刚添加到主列表的相同列表的内容。

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

    我有written about this before; C 将变量视为预先确定的内存块的方式根本不适用于 Python。名称被移动到值上,而不是值被复制到某个固定数量的存储桶中。

    (另外,吹毛求疵,但 Python 代码通常使用 under_scores 并且不会打扰名称中的类型,除非它真的模棱两可。所以你可能有 candidatesmulti_candidates。绝对不要把任何东西称为“数组”,因为标准库中有一个 array 模块,它做一些不同的事情,通常不太有用。:))

    【讨论】:

    • 这些也是列表,而不是数组,这让我的代码更加糟糕:]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多