Stack Overflow на русском Asked by daria k on December 11, 2021
Хочу добавлять числа в двумерный массив в цикле, есть вот такой код:
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]]
Как этого добиться?
В питоне списки - это объекты, и поэтому сам язык старается максимально оптимизировать их использование через ссылки, ленивые вычисления и так далее.
Когда вы создаете список с помощью кода array = [[]] * n
, то фактически вы создаете только список array[0]
, а все остальные списки становятся его копиями, записанными с помощью ссылки на этот созданный "нулевой" список.
Поэтому добавляя элементы в любой из списков, вы фактически добавляете эти элементы в array[0]
, а в остальных списках они появляются потому, что все остальные списки являются ссылками на array[0]
.
Для того, чтобы исправить данную ошибку, можно использовать генераторы списков:
array = [[] for _ in range(n)]
Answered by EzikBro on December 11, 2021
Создайте список следующим образом:
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)
Answered by dIm0n on December 11, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP