通过迭代列表追加项目

时间:2015-03-03 06:09:41

标签: python list python-3.x for-loop

我设计了一个跟踪功能,它将列表作为参数并返回另一个列表。

def function(list):
    A = []
    B = []
    for num in list:
        A.append(num)
        B.append(A)
    return B

在这个函数中,我假设函数会根据A的当前状态将A附加到A.在此假设下工作。我调用了函数

>>> test([1,2,3,4,5])

预计输出为

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]

然而,我得到的结果是

[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

这是为什么?有没有解决这个问题的方法?

4 个答案:

答案 0 :(得分:3)

您需要按值复制它。在您目前的情况下,您将通过引用传递。因此,每个索引都会随着A更改而更新。应该是:

    B.append(A[:])

注意[:]按值复制。

为了澄清,running your code here我们可以检查在function上调用[1,2]的结果:

Zalgo the pony is watching.

现在,考虑一下我们制作副本时会发生什么:

def function(list):
    A = []
    B = []
    for num in list:
        A.append(num)
        B.append(A[:])
    return B

print function([1,2])

3 copies, to rule them all.

另外,作为旁注:您应该更改变量的名称。例如,通过将参数声明为list,您可以隐藏list方法。

答案 1 :(得分:2)

您可以将A的副本附加到B,以避免使用A的相同参考:

for num in list:
      A.append(num)
      B.append(A[:])

答案 2 :(得分:2)

列表通过引用传递。要复制它们,请使用语法B.append(A[:])

def function(list):
    A = []
    B = []
    for num in list:
        A.append(num)
        B.append(A[:])
    return B

答案 3 :(得分:2)

在您的代码中,您发送引用而不是数据。

工作代码

def function(list):
   A = []
   B = []
   for num in list:
      A.append(num)
      B.append(A[:])
   return B