Python: список различий при инициализации - PullRequest
3 голосов
/ 20 июля 2009

Я хочу список, полный того же самого, где это будет либо строка, либо число. Есть ли разница в способе создания этих двух списков? Есть ли что-то скрытое, о чем я, вероятно, должен знать?

list_1 = [0] * 10

list_2 = [0 for i in range(10)]

Есть ли лучшие способы выполнить эту же задачу?

Заранее спасибо.

Ответы [ 3 ]

15 голосов
/ 20 июля 2009

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

>>> l = [[]] * 10
>>> l
[[], [], [], [], [], [], [], [], [], []]
>>> l[0].append(1)
>>> l
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> l = [[] for i in range(10)]
>>> l[0].append(1)
>>> l
[[1], [], [], [], [], [], [], [], [], []]

Для неизменных элементов поведение двух одинаково. Между ними может быть разница в производительности, но я не уверен, какая из них будет работать быстрее.

3 голосов
/ 20 июля 2009

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

Во второй форме он должен сначала оценить генератор и собрать все значения. Скорее всего, путем наращивания списка постепенно - что дорого из-за изменения размера.

Первый метод также должен быть наилучшим.

1 голос
/ 20 июля 2009

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

Поскольку исходный код пишется один раз и читается много раз, за ​​неизменяемые элементы я определенно голосую за первый вариант.

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