Python:防止全局修改参数数组

时间:2010-01-26 18:46:59

标签: python

我在这里遇到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")

2 个答案:

答案 0 :(得分:5)

您尝试的解决方案实际上并未复制数组。它为同一个数组指定一个新名称。如果要创建新数组,请尝试以下操作:

my_new_list = my_list[:]

这将创建一个包含旧列表切片的列表,其中切片从开头开始,到最后结束。换句话说,就是列表的完美副本。

答案 1 :(得分:1)

您可以使用copy.deepcopy()返回非链接列表。这也适用于嵌套列表和dicts。