2010-01-26 4 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 - Точно, просто измените на 'test (n-1, myList [:])' – sberry

+0

Есть ли обходное решение для этого на массивах (словари) тоже? он говорит «нераспакованный тип». – lamas

+1

Проверьте модуль копирования в библиотеке: 'another_d = copy.copy (d)'. Или попробуйте 'another_d = dict (d)'. – jcdyer

1

Вы можете использовать copy.deepcopy() для возврата несвязанного списка. Это также работает для вложенных списков и dicts.

Смежные вопросы