2010-01-26 25 views
1

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

回答

5

你尝试的解决方案不会将数组实际上复制。它为同一个数组分配一个新名称。如果你想创建一个新的数组,试试这个:

my_new_list = my_list[:] 

指将旧的列表,其中片开始之初的切片的列表,并在年底结束。换句话说,这是一个完美的副本。

+0

+1 - 没错,只是改变为'测试(N-1,myList中[:])' – sberry 2010-01-26 18:52:48

+0

是否有关于阵列(字典)这样做太一些解决方法吗?它说“不可能的类型”。 – lamas 2010-01-26 18:54:08

+1

检出库中的复制模块:'another_d = copy.copy(d)'。或者尝试'another_d = dict(d)'。 – jcdyer 2010-01-26 19:01:06

1

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