Qual é a melhor maneira de criar uma nova lista vazia no Python?
l = []
ou
l = list()
Estou perguntando isso por dois motivos:
- Razões técnicas, quanto ao que é mais rápido. (criar uma classe causa sobrecarga?)
- Legibilidade do código - qual é a convenção padrão.
python
performance
list
coding-style
timeit
user225312
fonte
fonte
Respostas:
Aqui está como você pode testar qual parte do código é mais rápida:
No entanto, na prática, essa inicialização provavelmente é uma parte extremamente pequena do seu programa, portanto, se preocupar com isso provavelmente é errado.
A legibilidade é muito subjetiva. Eu prefiro
[]
, mas algumas pessoas muito qualificadas, como Alex Martelli, preferemlist()
porque é pronunciável .fonte
list('')
dar em[]
vez de['']
?list('abcd')
e você entenderá tudo) #list()
é inerentemente mais lento que[]
, porqueexiste uma pesquisa de símbolo (não há como o python saber antecipadamente se você não redefiniu a lista como algo diferente!),
há invocação de função,
então ele deve verificar se houve um argumento iterável passado (para que ele possa criar uma lista com elementos dele) ps. nenhum no nosso caso, mas existe uma verificação "se"
Na maioria dos casos, a diferença de velocidade não fará nenhuma diferença prática.
fonte
list()
é mais lento que[]
!list()
, basta verificar se houve algum argumento ... "verifique se iterável" e "criar lista com elementos" simplesmente não acontecem; eles se aplicam apenas se houver um argumento. É até possível que o código C para[]
chame o mesmo código C quelist()
. De qualquer forma, o tempo envolvido em (c) seria pequeno comparado com (a) + (b).Eu uso
[]
.fonte
Eu realmente não sei, mas parece-me, por experiência, que jpcgt está realmente certo. Exemplo a seguir: Se eu usar o seguinte código
no intérprete, a chamada t me dá apenas "t" sem nenhuma lista e, se eu anexar outra coisa, por exemplo
Recebo o erro "O objeto 'NoneType' não tem atributo 'anexar'". Se, no entanto, eu criar a lista por
então funciona bem.
fonte
t.append(1)
modificações sãot
efetuadas, não retornam nada,None
e você está atribuindo issoNone
at
. Então,t
refere-se agora a emNone
vez de à lista. Seu erro aqui foi escrever emt=t.append(1)
vez de apenast.append(1)
. Você notará o mesmo comportamento comlist()
, então não há diferença aqui.Apenas para destacar a resposta do @Darkonaut porque acho que deveria ser mais visível.
new_list = []
ounew_list = list()
ambos são bons (ignorando o desempenho), masappend()
retornamNone
, como resultado, você não pode fazernew_list = new_list.append(something
.Estou muito intrigado com uma decisão desse tipo de retorno. Que nojo.
fonte