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

1 投票
2 回答
617 浏览
提问于 2025-04-15 18:29

我在使用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[:]

这个方法会创建一个新列表,它包含了旧列表的一部分,这部分从头开始,一直到尾。换句话说,就是旧列表的完美复制。

撰写回答