Создание списка отдельных элементов, повторяющихся n раз в Python
Неизменяемые элементы
Для неизменяемых элементов, таких как None, строки, кортежи или frozensets, вы можете сделатьэто выглядит так:
[e] * 4
Обратите внимание, что это лучше всего использовать только с неизменяемыми элементами (строками, кортежами, frozensets,) в списке, поскольку все они указывают на один и тот же элемент в одном и том же месте в памяти.Я часто использую это, когда мне нужно построить таблицу со схемой из всех строк, чтобы мне не приходилось отображать один в один.
schema = ['string'] * len(columns)
Изменяемые элементы
Я уже давно использую Python, и никогда не видел ни одного варианта использования, где бы я делал это с изменяемым экземпляром.Вместо этого, чтобы получить, скажем, изменяемый пустой список, набор или диктовку, вы должны сделать что-то вроде этого:
list_of_lists = [[] for _ in columns]
Подчеркивание - это просто одноразовое имя переменной в этом контексте.
Если у вас есть только число, это будет:
list_of_lists = [[] for _ in range(4)]
_
не является особенным, но ваша программа проверки стиля среды кодирования, вероятно, пожалуется, если вы не собираетесь использовать переменную ииспользуйте любое другое имя.
Предостережения для использования неизменяемого метода с изменяемыми элементами:
Остерегайтесь делать это с изменяемыми объектами , когда вы меняете один из них,все они меняются, потому что они все один и тот же объект:
foo = [[]] *4
foo[0].append('x')
foo теперь возвращает:
[['x'], ['x'], ['x'], ['x']]
Но с неизменяемыми объектами вы можете заставить его работатьпотому что вы изменяете ссылку, а не объект:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
Но опять же, изменяемые объекты не годятся для этого, потому что операции на месте изменяют объект, а не ссылку:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]