Python: предотвращение глобального изменения массива аргументов - PullRequest
1 голос
/ 26 января 2010

У меня проблема с питоном здесь. Если я передаю массив через рекурсивную функцию, которая добавляет что-то в массив при каждом его вызове, массив модифицируется в каждом случае

Код:

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 ]

5 голосов
/ 26 января 2010

Ваша попытка решения на самом деле не копирует массив. Он присваивает новое имя тому же массиву. Если вы хотите создать новый массив, попробуйте это:

my_new_list = my_list[:]

Это создает список, содержащий фрагмент старого списка, где фрагмент начинается в начале и заканчивается в конце. Другими словами, идеальная копия списка.

1 голос
/ 30 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...