Qual é a diferença entre:
some_list1 = []
some_list1.append("something")
e
some_list2 = []
some_list2 += ["something"]
python
list
concatenation
Não
fonte
fonte
extend
.+=
vsextend
: stackoverflow.com/questions/3653298/…+=
vsappend
stackoverflow.com/q/252703/6674599Respostas:
Para o seu caso, a única diferença é o desempenho: o acréscimo é duas vezes mais rápido.
Em geral
append
, o item adiciona um item à lista, enquanto+=
copia todos os elementos da lista do lado direito para a lista do lado esquerdo.Atualização: análise perf
Comparando bytecodes, podemos assumir que a
append
versão desperdiça ciclos emLOAD_ATTR
+CALL_FUNCTION
e + = version-inBUILD_LIST
. AparentementeBUILD_LIST
superaLOAD_ATTR
+CALL_FUNCTION
.Podemos melhorar ainda mais o desempenho removendo a
LOAD_ATTR
sobrecarga:fonte
append
vs+=
, deve incluir a criação da lista como parte da medição. Caso contrário, seria uma pergunta diferente (extend
vs+=
).No exemplo que você deu, não há diferença, em termos de saída, entre
append
e+=
. Mas há uma diferença entreappend
e+
(sobre o qual a pergunta originalmente foi feita).Como você pode ver,
append
e+=
tenha o mesmo resultado; eles adicionam o item à lista, sem produzir uma nova lista. Usar+
adiciona as duas listas e produz uma nova lista.fonte
append
adicionar uma entrada à lista, enquanto + = adiciona quantas houver na outra lista (ou seja, aliases paraextend
). Mas ele / ela já sabe disso, julgando pela forma como a pergunta foi escrita. Há alguma outra diferença que estou perdendo?Veja que o apêndice adiciona um único elemento à lista, que pode ser qualquer coisa.
+=[]
junta-se às listas.fonte
+ = é uma tarefa. Quando você o usa, está realmente dizendo 'some_list2 = some_list2 + [' something ']'. As atribuições envolvem religação, portanto:
O operador + = também deve normalmente criar um novo objeto de lista como list + list normalmente:
No entanto, na realidade:
Isso ocorre porque as listas Python implementam __iadd __ () para criar um curto-circuito na atribuição aumentada + = e chamar list.extend (). (É uma verruga estranha: isso geralmente faz o que você quis dizer, mas por razões confusas.)
Em geral, se você estiver anexando / estendendo uma lista existente e quiser manter a referência à mesma lista (em vez de criar uma nova), é melhor ser explícito e seguir o append () / extend () métodos.
fonte
é na verdade
para um valor, não há diferença. A documentação declara que:
Portanto, obviamente,
s.append(x)
é o mesmo ques.extend([x])
fonte
A diferença é que concatenar achatará a lista resultante, enquanto o apêndice manterá os níveis intactos:
Então, por exemplo, com:
Usando o anexo, você acaba com uma lista de listas:
Usando concatenar, você acaba com uma lista simples:
fonte
Os testes de desempenho aqui não estão corretos:
por exemplo
bons testes podem ser encontrados aqui: http://markandclick.com/1/post/2012/01/python-list-append-vs.html
fonte
+= [one_var]
. Se omitirmos a criação de listas, + = se torna a opção mais rápida.Além dos aspectos descritos nas outras respostas, anexar e + [] têm comportamentos muito diferentes quando você está tentando criar uma lista de listas.
list1 + ['5', '6'] adiciona '5' e '6' à lista1 como elementos individuais. list1.append (['5', '6']) adiciona a lista ['5', '6'] à lista1 como um único elemento.
fonte
O comportamento de religação mencionado em outras respostas é importante em determinadas circunstâncias:
Isso ocorre porque as atribuições aumentadas sempre são religadas, mesmo que o objeto tenha sido alterado no local. A religação aqui acontece
a[1] = *mutated list*
, o que não funciona para tuplas.fonte
vamos dar um exemplo primeiro
fonte
O método append () adiciona um único item à lista existente
Então aqui o some_list1 será modificado.
Atualizada:
Enquanto usar + para combinar os elementos das listas (mais de um elemento) na lista existente, semelhante à extensão (conforme corrigida pelo Flux ).
Então aqui a some_list2 e ["something"] são as duas listas que são combinadas.
fonte
+=
não retorna uma nova lista. O FAQ de programação diz: "... para listas,__iadd__
é equivalente a entrarextend
na lista e retornar a lista. É por isso que dizemos que para listas,+=
é um" atalho "paralist.extend
". Você também pode ver isso no código fonte do CPython: github.com/python/cpython/blob/v3.8.2/Objects/…"+" não altera a lista
.append () modifica a lista antiga
fonte