Você também pode escrever:
[e] * n
Você deve observar que, se e é, por exemplo, uma lista vazia, você obtém uma lista com n referências à mesma lista, e não n listas vazias independentes.
Teste de performance
À primeira vista, parece que a repetição é a maneira mais rápida de criar uma lista com n elementos idênticos:
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
Mas espere - não é um teste justo ...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
A função itertools.repeat
não cria realmente a lista, apenas cria um objeto que pode ser usado para criar uma lista, se você desejar! Vamos tentar isso novamente, mas convertendo para uma lista:
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
Então, se você quiser uma lista, use [e] * n
. Se você deseja gerar os elementos lentamente, use repeat
.
[[]] * n
poderá produzir resultados inesperados. Para criar sub-listas vazias exclusivas , use-a para compreensão:[[] for i in range(0,n)]
Tenha cuidado quando o item que está sendo repetido for uma lista. A lista não será clonada: todos os elementos se referirão à mesma lista!
fonte
Itens imutáveis
Para itens imutáveis, como None, bools, ints, floats, strings, tuplas ou frozensets, você pode fazer o seguinte:
Observe que isso é melhor usado apenas com itens imutáveis (cadeias de caracteres, tuplas, conjuntos de frozens) na lista, porque todos apontam para o mesmo item no mesmo local na memória. Uso isso frequentemente quando tenho que construir uma tabela com um esquema de todas as strings, para não precisar fornecer um mapeamento altamente redundante para um.
Itens mutáveis
Eu uso o Python há muito tempo e nunca vi um caso de uso em que faria isso acima com uma instância mutável. Em vez disso, para obter, digamos, uma lista vazia mutável, definir ou ditar, você deve fazer algo assim:
O sublinhado é simplesmente um nome de variável descartável nesse contexto.
Se você tiver apenas o número, seria:
A
_
não é realmente especial, mas o verificador de estilo ambiente de codificação provavelmente vai reclamar se você não pretende usar a variável e usar qualquer outro nome.Advertências para o uso do método imutável com itens mutáveis:
Cuidado ao fazer isso com objetos mutáveis , quando você altera um deles, todos eles mudam porque são todos o mesmo objeto:
foo agora retorna:
Mas com objetos imutáveis, você pode fazê-lo funcionar porque altera a referência, não o objeto:
Mas, novamente, objetos mutáveis não são bons para isso, porque as operações no local alteram o objeto, não a referência:
fonte
O Itertools tem uma função exatamente para isso:
É claro que
itertools
fornece um iterador em vez de uma lista.[e] * n
fornece uma lista, mas, dependendo do que você fará com essas seqüências, aitertools
variante pode ser muito mais eficiente.fonte
Como outros já apontaram, o uso do operador * para um objeto mutável duplica as referências; portanto, se você alterar um, altere todas. Se você deseja criar instâncias independentes de um objeto mutável, sua sintaxe xrange é a maneira mais Pythonic de fazer isso. Se você se incomodar com uma variável nomeada que nunca é usada, poderá usar a variável de sublinhado anônimo.
fonte
Deveria trabalhar
fonte