Por que essas duas operações ( append()
resp. +
) Fornecem resultados diferentes?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
No último caso, há realmente uma recursão infinita. c[-1]
e c
são iguais. Por que é diferente com a +
operação?
python
list
append
nested-lists
ooboo
fonte
fonte
+=
: stackoverflow.com/questions/725782/…Respostas:
Para explicar o "porquê":
A
+
operação adiciona os elementos da matriz à matriz original. Aarray.append
operação insere a matriz (ou qualquer objeto) no final da matriz original, o que resulta em uma referência a si mesmo naquele ponto (daí a recursão infinita).A diferença aqui é que a operação + atua de maneira específica quando você adiciona um array (está sobrecarregado como os outros, consulte este capítulo sobre sequências) concatenando o elemento. O método append, entretanto, faz literalmente o que você pede: acrescenta o objeto no lado direito que você deu a ele (o array ou qualquer outro objeto), em vez de pegar seus elementos.
Uma alternativa
Use
extend()
se quiser usar uma função que atua de forma semelhante ao operador + (como outros também mostraram aqui). Não é aconselhável fazer o oposto: tentar imitar o acréscimo com o operador + para listas (veja meu link anterior sobre o porquê).Pouca historia
Para se divertir, um pouco de história: o nascimento do módulo array em Python em fevereiro de 1993. pode surpreendê-lo, mas os arrays foram adicionados depois que as sequências e listas passaram a existir.
fonte
+
ser simétricas: concatenar lista com lista.O operador de concatenação
+
é um operador de infixo binário que, quando aplicado a listas, retorna uma nova lista contendo todos os elementos de cada um de seus dois operandos. Olist.append()
método é ummutator
nolist
qual anexa seu únicoobject
argumento (em seu exemplo específico, a listac
) ao assuntolist
. Em seu exemplo, isso resulta noc
acréscimo de uma referência a si mesmo (daí a recursão infinita).Uma alternativa para concatenação '+'
O
list.extend()
método também é um método modificador que concatena seusequence
argumento com o assuntolist
. Especificamente, ele anexa cada um dos elementos desequence
na ordem de iteração.Um aparte
Sendo um operador,
+
retorna o resultado da expressão como um novo valor. Por ser ummutator
método sem encadeamento ,list.extend()
modifica a lista de assuntos no local e não retorna nada.Arrays
Eu adicionei isso devido à confusão potencial que a resposta de Abel acima pode causar ao misturar a discussão de listas, sequências e matrizes.
Arrays
foram adicionados ao Python após sequências e listas, como uma maneira mais eficiente de armazenar matrizes de tipos de dados integrais. Não confundaarrays
comlists
. Eles não são os mesmos.Dos documentos do array :
Arrays são tipos de sequência e se comportam de maneira muito semelhante a listas, exceto que o tipo de objetos armazenados neles é restrito. O tipo é especificado no momento da criação do objeto usando um código de tipo, que é um único caractere.
fonte
append
está anexando um elemento a uma lista. se você quiser estender a lista com a nova lista que você precisa usarextend
.fonte
+
eextend
produzisse resultados diferentes nos quais teríamos algo em que pensar.append
e+
são diferentes. É por isso. Gosto dessa resposta porque oferece o que fazer que faz mais sentido.__lt__
que não podia ser sobrecarregado no Python (hoje em dia pode). As perguntas por que são as mais essenciais, mas geralmente as mais difíceis de responder: elas pedem a essência, não uma indicação do manual. E claro: se você não gosta de uma pergunta (eu não gosto mais), então não responda ;-)c += [c]
ec.append(c[:])
também.a+b != a*b
? Eles são operações diferentes. Essa é a resposta. "Por que" não é tão útil quanto outras perguntas, como "Como posso anexar corretamente?" Ou "O que há de errado com este apêndice que leva à recursão infinita?" Perguntas do tipo "O que faço com X" ou "O que deu errado quando fiz X"? Ou "O que devo fazer em vez de X" também ajudará alguém a aprender, mas fornecerá respostas focadas, utilizáveis e acionáveis.As listas do Python são heterogêneas, ou seja, os elementos da mesma lista podem ser qualquer tipo de objeto. A expressão:
c.append(c)
anexa o objetoc
, seja ele qual for, à lista. No caso, torna a própria lista um membro da lista.A expressão
c += c
adiciona duas listas e atribui o resultado à variávelc
. O+
operador sobrecarregado é definido em listas para criar uma nova lista cujo conteúdo são os elementos da primeira lista e os elementos da segunda lista.Portanto, essas são apenas expressões diferentes usadas para fazer coisas diferentes por design.
fonte
O método que você está procurando é
extend()
. Da documentação do Python :fonte
você deve usar extend ()
outras informações: anexar vs. estender
fonte
Veja a documentação :
c.append(c)
"anexa" c a si mesmo como um elemento . Como uma lista é um tipo de referência, isso cria uma estrutura de dados recursiva.c += c
é equivalente aextend(c)
, que anexa os elementos de c a c.fonte