我设计了一个跟踪功能,它将列表作为参数并返回另一个列表。
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 :(得分:3)
您需要按值复制它。在您目前的情况下,您将通过引用传递。因此,每个索引都会随着A
更改而更新。应该是:
B.append(A[:])
注意[:]
按值复制。
为了澄清,running your code here我们可以检查在function
上调用[1,2]
的结果:
现在,考虑一下我们制作副本时会发生什么:
def function(list):
A = []
B = []
for num in list:
A.append(num)
B.append(A[:])
return B
print function([1,2])
另外,作为旁注:您应该更改变量的名称。例如,通过将参数声明为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