Вы также можете написать:
[e] * n
Вы должны заметить, что если e является, например, пустым списком, вы получите список с n ссылками на один и тот же список, а не с n независимыми пустыми списками.
Тестирование производительности
На первый взгляд кажется, что repeat - самый быстрый способ создать список с n одинаковыми элементами:
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
Но подождите - это не честный тест ...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
Функция на itertools.repeat
самом деле не создает список, она просто создает объект, который можно использовать для создания списка, если хотите! Давайте попробуем это снова, но преобразуем в список:
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
Так что если вы хотите список, используйте [e] * n
. Если вы хотите генерировать элементы лениво, используйте repeat
.
[[]] * n
может привести к неожиданным результатам. Чтобы создать уникальные пустые[[] for i in range(0,n)]
Будьте осторожны, когда повторяющийся элемент является списком. Список не будет клонирован: все элементы будут ссылаться на один и тот же список!
источник
Неизменные предметы
Для неизменяемых элементов, таких как None, bools, ints, float, string, кортежи или frozensets, вы можете сделать это следующим образом:
Обратите внимание, что это лучше всего использовать только с неизменяемыми элементами (строками, кортежами, frozensets,) в списке, потому что все они указывают на один и тот же элемент в одном и том же месте в памяти. Я использую это часто, когда мне нужно построить таблицу со схемой из всех строк, чтобы мне не приходилось давать сильно избыточное сопоставление один к одному.
Изменчивые предметы
Я уже давно использую Python, и никогда не видел ни одного варианта использования, где бы я делал это с изменяемым экземпляром. Вместо этого, чтобы получить, скажем, изменчивый пустой список, набор или dict, вы должны сделать что-то вроде этого:
Подчеркивание - это просто одноразовое имя переменной в этом контексте.
Если у вас есть только номер, это будет:
Это на
_
самом деле не особенное, но ваша программа проверки стиля среды кодирования, вероятно, пожалуется, если вы не собираетесь использовать переменную и использовать любое другое имя.Предостережения относительно использования неизменяемого метода с изменяемыми элементами:
Остерегайтесь делать это с изменяемыми объектами , когда вы меняете один из них, они все меняются, потому что они все один и тот же объект
Foo теперь возвращает:
Но с неизменяемыми объектами вы можете заставить его работать, потому что вы изменяете ссылку, а не объект:
Но опять же, изменяемые объекты не годятся для этого, потому что операции на месте изменяют объект, а не ссылку:
источник
Itertools имеет функцию только для этого:
Конечно,
itertools
вы получите итератор вместо списка.[e] * n
дает вам список, но, в зависимости от того, что вы будете делать с этими последовательностями,itertools
вариант может быть гораздо более эффективным.источник
Как уже отмечали другие, использование оператора * для изменяемого объекта дублирует ссылки, поэтому, если вы измените один, вы измените их все. Если вы хотите создать независимые экземпляры изменяемого объекта, ваш синтаксис xrange - самый питонский способ сделать это. Если вас беспокоит наличие именованной переменной, которая никогда не используется, вы можете использовать анонимную переменную подчеркивания.
источник
должно сработать
источник