Добавление элементов в двумерный массив

Хочу добавлять числа в двумерный массив в цикле, есть вот такой код:

customers = [1,3,5,7,3,7,9,67]
n = 4
if len(customers) == 0:
    print(0)
elif n == 1:
    print (sum(customers))
elif n >= len(customers):
    print(max(customers))
else: #СОДЕРЖАТЕЛЬНАЯ ЧАСТЬ
    tills = [[]]*n
    j = 0
    for i in range(len(customers)):
        tills[j].append(customers[i])
        if j < n-1:
            j += 1
        else:
            j = 0

print(tills)

НО я не понимаю, почему вывод вот такой:

[[1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67], [1, 3, 5, 7, 3, 7, 9, 67]]

По моей логике (что и нужно получить мне), должно быть вот так:

[[1,3],[3,7],[5,9],[7,67]]

Как этого добиться?


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

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

Создайте список следующим образом:

customers = [1,3,5,7,3,7,9,67]
n = 4
if len(customers) == 0:
    print(0)
elif n == 1:
    print (sum(customers))
elif n >= len(customers):
    print(max(customers))
else: #СОДЕРЖАТЕЛЬНАЯ ЧАСТЬ
    tills = [[] for _ in range(n)]
    j = 0
    for i in range(len(customers)):
        tills[j].append(customers[i])
        if j < n-1:
            j += 1
        else:
            j = 0

print(tills)
→ Ссылка
Автор решения: EzikBro

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

Когда вы создаете список с помощью кода array = [[]] * n, то фактически вы создаете только список array[0], а все остальные списки становятся его копиями, записанными с помощью ссылки на этот созданный "нулевой" список.

Поэтому добавляя элементы в любой из списков, вы фактически добавляете эти элементы в array[0], а в остальных списках они появляются потому, что все остальные списки являются ссылками на array[0].

Для того, чтобы исправить данную ошибку, можно использовать генераторы списков:

array = [[] for _ in range(n)]
→ Ссылка