я использовал append () в цикле и по какой-то причине список меняется каждый раз не так, как должен - PullRequest
1 голос
/ 22 мая 2019

Я написал этот код:

if __name__ == "__main__" :
    lst = []
    current= []
    for i in range(3):
        print(current)
        print(lst)
        lst.append(current)
        print(lst)
        current.append(i)

Я ожидал, что он напечатает:

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

Но вместо этого он напечатал:

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

Я непонять, почему lst меняет своих членов на текущих.

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

вместо этой строки lst.append(current), перейдите к следующему:

from copy import copy

lst.append(copy(current))

Эта проблема в том, что когда вы добавляете current к lst, он выглядит хорошо, но на следующей итерации, когда выизмените текущий и добавьте его снова, он изменит предыдущий current, который вы уже добавили.вот почему вы видите два [0] и три [0, 1]

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

Также читаете Эта ссылка будет иметь положительный эффект от того, что является копией и типами копий.

0 голосов
/ 22 мая 2019

Мелкая копия

Мелкая копия создает новый составной объект, а затем (по мере возможности) вставляет в него ссылки на объекты, найденные в оригинале.

lst.append(current[:]) # shallow-copy

работает как в Python 2, так и в 3.

lst = []
current= []
for i in range(3):
    print(current)
    print(lst)
    lst.append(current[:]) # shallow-copy
    print(lst)
    current.append(i)
0 голосов
/ 22 мая 2019

, если вы не выполните copy или deep copy, каждый элемент lst будет указывать на current

import copy
lst = []
current= []
for i in range(3):
        print(current)
        print(lst)
        lst.append(copy.copy(current))
        print(lst)
        current.append(i)

, чтобы напечатать желаемый результат

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