Список получился не так как нужно. Почему?

l = [1, 2, 3, 4, 5, 6]
ll = []
for i in range(len(l)):
    if l[i] % 2 == 0:
        l[i] = 0
        ll.append(l)
print(ll)

>>> [[1, 0, 3, 0, 5, 0], [1, 0, 3, 0, 5, 0], [1, 0, 3, 0, 5, 0]]

Почему так вышло я не понимаю?

Я ожидал [[1, 0, 3, 4, 5, 6], [1, 0, 3, 0, 5, 6], [1, 0, 3, 0, 5, 0]]


Ответы (2 шт):

Автор решения: Albert

Это происходит из-за того, что все ячейки списка ll ссылаются на один список l, который вы изменяете. Попробуем проверить этим кодом:

l = [1, 2, 3, 4, 5, 6]
ll = []
for i in range(len(l)):
    if l[i] % 2 == 0:
        l[i] = 0
        ll.append(l)
        print(ll)

Вот что будет на выходе:

>> [[1, 0, 3, 4, 5, 6]]
>> [[1, 0, 3, 0, 5, 6], [1, 0, 3, 0, 5, 6]]
>> [[1, 0, 3, 0, 5, 0], [1, 0, 3, 0, 5, 0], [1, 0, 3, 0, 5, 0]]

Более подробно можете прочитать в ответе на этот вопрос: Переменные-ссылки в Python

Для того, чтобы добавить в список копию списка, а не ссылку на список вы можете воспользоваться функцией list() или методом copy():

l = [1, 2, 3, 4, 5, 6]
ll = []
for i in range(len(l)):
    if l[i] % 2 == 0:
        l[i] = 0
        ll.append(list(l)) # можно использовать ll.append(l.copy())
print(ll)
>> [[1, 0, 3, 4, 5, 6], [1, 0, 3, 0, 5, 6], [1, 0, 3, 0, 5, 0]]
→ Ссылка
Автор решения: TigerTV.ru

Решается просто, добавлением [:]:

l = [1, 2, 3, 4, 5, 6]
ll = []
for i in range(len(l)):
    if l[i] % 2 == 0:
        l[i] = 0
        ll.append(l[:])
print(ll)

→ Ссылка