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 个回答
1
你可以使用 copy.deepcopy()
来返回一个不相互关联的列表。这种方法也适用于嵌套的列表和字典。
5
你尝试的解决方案其实并没有真正复制数组。它只是给同一个数组起了个新名字。如果你想创建一个新的数组,可以试试这个:
my_new_list = my_list[:]
这个方法会创建一个新列表,它包含了旧列表的一部分,这部分从头开始,一直到尾。换句话说,就是旧列表的完美复制。