我在这里遇到python问题。如果我通过一个递归函数传递一个数组,每次调用它时都会向数组添加一些东西,在每个实例中修改数组
代码:
def test(n,myList):
if n>0:
myList.append("Test")
print ( "BEFORE CALL Instance ", n, myList )
test(n-1,myList)
print ( "AFTER CALL Instance ", n, myList )
else:
return
通过test(5,[])
执行
结果:
BEFORE CALL Instance 5 ['Test']
BEFORE CALL Instance 4 ['Test', 'Test']
BEFORE CALL Instance 3 ['Test', 'Test', 'Test']
BEFORE CALL Instance 2 ['Test', 'Test', 'Test', 'Test']
BEFORE CALL Instance 1 ['Test', 'Test', 'Test', 'Test', 'Test']
AFTER CALL Instance 1 ['Test', 'Test', 'Test', 'Test', 'Test']
AFTER CALL Instance 2 ['Test', 'Test', 'Test', 'Test', 'Test']
AFTER CALL Instance 3 ['Test', 'Test', 'Test', 'Test', 'Test']
AFTER CALL Instance 4 ['Test', 'Test', 'Test', 'Test', 'Test']
AFTER CALL Instance 5 ['Test', 'Test', 'Test', 'Test', 'Test']
实际问题:
每个子函数都在修改所有父函数中的数组。我该如何防止这种情况?
将列表复制到新列表并进行修改会产生与上面相同的输出
myListNew=myList
myListNew.append("Test")
答案 0 :(得分:5)
您尝试的解决方案实际上并未复制数组。它为同一个数组指定一个新名称。如果要创建新数组,请尝试以下操作:
my_new_list = my_list[:]
这将创建一个包含旧列表切片的列表,其中切片从开头开始,到最后结束。换句话说,就是列表的完美副本。
答案 1 :(得分:1)
您可以使用copy.deepcopy()
返回非链接列表。这也适用于嵌套列表和dicts。