python рекурсия добавляется в список - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь добавить ток к мастеру каждый раз, когда текущие изменения. Мне не удалось использовать список. Мне удалось изменить строки и добавить разные строки в мастер, но было бы намного проще, если бы я мог использовать список.

master = []

def recur(count,current):
    count = count + 1
    if (count == 5):
        return
    current.append(1)
    master.append(current)
    recur(count,current)


recur(0,[])

print(master)
# out put
# [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

# what I expected
# [[1], [1,1], [1,1,1], [1,1,1,1]]

Ответы [ 3 ]

1 голос
/ 18 января 2020

Причина в том, что вы добавляете ссылку из списка current к мастеру. Таким образом, каждый раз, когда вы изменяете current, также изменяются ранее добавленные списки.

Используйте эту ссылку для визуализации: нажмите здесь

enter image description here

>>>def recur(count,current):
    count = count + 1
    if (count == 5):
        return
    current.append(1)
    master.append(current)
    recur(count,current)


>>> master=[]
>>> recur(0,[])
>>> master
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> for i in master:
    id(i)


2485591104264
2485591104264
2485591104264
2485591104264
>>> 

Метод 1

Вы можете попробовать это. Нет необходимости отслеживать список current, к которому вы добавляете master.

def recur(count):
    count+=1
    if count==5:
        return
    curr=[1]*count
    #print(curr)
    master.append(curr)
    recur(count)
master=[]
recur(0)
print(master)

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

Метод 2

Если вы заинтересованы в использовании current, попробуйте это. Визуализация для этого кода нажмите здесь.

Image 2

def recur(count,curr):
    count+=1
    if count==5:
        return
    curr.append(1)
    master.append(curr)
    recur(count,curr[:])
master=[]
recur(0,[])
print(master)

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

Метод 3

Или вы можете попробовать это.

def recur(count,curr):
    count+=1
    if count==5:
        return
    curr.append(1)
    master.append(curr[:])
    recur(count,curr)
master=[]
recur(0,[])
print(master)

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

Метод 4

Если вы хотите вернуть [[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]], попробуйте это.

def recur(count,curr):
    count+=1
    if count==5:
        return []
    curr.append(1)
    return [curr]+recur(count,curr[:])
master=recur(0,[])
print(master)
another_master=recur(0,[])
print(another_master)

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]

[[1], [1, 1], [1, 1, 1], [1, 1, 1, 1]]
1 голос
/ 18 января 2020

Это то, что вы хотите:

master = []

def recur(count, current):
    count += 1
    if (count == 5):
        return

    new_current = current.copy()

    new_current.append(1)
    master.append(new_current)

    recur(count, new_current)


recur(0, [])

print(master)

Проблема в том, что current является ссылкой на объект списка ... а не на сам фактический список. Поэтому, когда вы добавляете current к master, вы просто добавляете ссылку на тот же объект списка. Поэтому, когда вы добавляете новый элемент в список current, он добавляется в один список, на который указывают все ваши ссылки.

Решение состоит в том, чтобы взять копию из current список, чтобы сохранить его состояние в то время. Существуют различные типы copy - глубокие и мелкие. Shallow создаст копию объекта списка, но не его элементов, а глубокая копия будет проходить через элементы и любые подэлементы, если у вас есть список списков, например.

0 голосов
/ 18 января 2020

Попробуйте код ниже,

master = []

def recur(count, current):
    count += 1
    if (count == 5):
        return
    tmp = current[:]
    tmp.append(1)
    master.append(tmp)
    recur(count, tmp)

recur(0, [])

master

вывод

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