Доступ к глобальной переменной в рекурсивной функции - PullRequest
0 голосов
/ 11 сентября 2018

Я написал рекурсивную функцию, которая создает комбинации всех возможных результатов данных nx3, где n является переменной

структура точки данных [name_of_variable cluster_number уникальность_условие]

from collections import defaultdict
x= [[1,1,'a'],[2,1,'b'],[3,1,'c'],[4,2,'c'],[5,2,'d'],[6,2,'a'],[7,3,'a'],[8,3,'d']]
c=defaultdict(list)
for i in x:
    c[i[1]]+=[i]
w=list()
def rec_cal(i,lis):
    if i in c.keys():
        for j in c[i]:
            lis.append(j[0])
            rec_cal(i+1,lis)
            lis.pop()
    else:
        global w
        w.append(lis)##print(lis)
rec_cal(1,[])

Я пытаюсь сохранить все сгенерированные 3 пары в w, но в конце я получаю пустой список, где я ошибаюсь, любая помощь будет оценена

p.s. Если напишите print (lis) вместо w.append (lis), все правильные списки будут напечатаны.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Когда вы звоните w.append(lis), вы добавляете ссылку к списку lis, а не копию списка.Все, что вы добавляете в lis, также выскакивает, когда возвращается рекурсивная функция, поэтому все, что вы получите в w, будет много ссылок на тот же пустой список.

Кроме того, не делайтеi in c.keys(), просто сделайте i in c, и вы не назначаете новое значение для w, поэтому нет необходимости использовать global w.

0 голосов
/ 11 сентября 2018

Запуск

w[0] is w[1]

может помочь вам понять, почему он не работает.Все ссылки, которые вы добавили, указывают на один и тот же объект.

Замена

w.append(lis)

на

w.append(lis.copy())

- это быстрое решение.Но будьте осторожны с мутирующими списками и ссылочными списками.

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