Самый общий ответ к этому следует использовать list.extend()
и a generator expression:
l.extend(generate_value() for _ in range(n))
Это добавит значения n
раз. Обратите внимание, что это будет оценивать generate_value()
каждый раз, вопросы побочных пошагового с изменяемыми значениями, другие ответы могут быть:
>>> [[1]] * 5
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]]
>>> [[1] for _ in range(5)]
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1], [1], [1], [1]]
При использовании метода умножения, вы в конечном итоге со списком русских ссылок на тот же список. Когда вы меняете его, вы видите изменение в каждом элементе списка - поскольку они все одинаковы.
При использовании выражения генератора или понимания списка для каждого подкласса создается новый список, поэтому каждый элемент имеет другое значение. Изменение только влияет только на это.
Очевидно, что в вашем примере значения неизменяемы, поэтому это не имеет значения - но это стоит помнить для разных случаев, или если значения не могут быть неизменными.
'l = [0.5] * 5' – falsetru
Это определит l, а не прилагается к нему. Если l уже имеет значения, они будут потеряны. – Boo
Спасибо, Lattyware за самый общий ответ, хотя я буду использовать решение Boo в этом конкретном случае;) – Bsje