2015-03-03 155 views
1

我设计了一个将列表作为参数并返回另一个列表的函数。通过迭代列表追加项目

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]] 

为什么是这样的结果呢?围绕这个问题有什么解决方案吗?

+0

你正在做的是按引用传递,而不是A的价值内容的地址的时刻。因此最后它显示了A的重复内容,而不是显示存储时的值。 基本pythonic的方式来做到这一点。正如@Paul Lo建议/回答。 并没有这不是一个问题,但一个基本的python“属性” – smitkpatel 2015-03-03 06:25:22

回答

2

可以的A拷贝追加到B避免使用的A相同的参考:

for num in list: 
     A.append(num) 
     B.append(A[:]) 
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方法。

+0

很短的时间内一个很好的和详细的教程! – 2015-03-03 06:26:10

+2

@PaulLo:谢谢。 :)但大部分的功劳应该归功于那些制作漂亮程序的人,这些人很容易想象这些照片! (www.pythontutor.com) – Dair 2015-03-03 06:45:30

2

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

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

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

工作代码

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