Python doc diz que fatiar uma lista retorna uma nova lista.
Agora, se uma "nova" lista está sendo retornada, eu tenho as seguintes perguntas relacionadas a "Atribuição de fatias"
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Agora a saída seria:
[4, 5, 3]
- Como algo que está retornando algo pode aparecer no lado esquerdo da expressão?
- Sim, li a documentação e diz que é possível, agora, uma vez que o fatiamento de uma lista retorna uma "nova" lista, por que a lista original está sendo modificada? Não consigo entender a mecânica por trás disso.
a[0] = 4
que faria?=
, então, em vez de descartar isso como sintaxe inválida, o python o transforma em algo mais parecido com o que você espera. Como o python não tem referências, não funcionaria se o resultado de uma fatia alterasse a lista original. Você consegue uma cópia. Se você forneceu mais informações sobre seu aplicativo, podemos ajudá-lo melhor a fazer as coisas da maneira 'pítônica'. :)Respostas:
Você está confundindo duas operações distintas que usam sintaxe muito semelhante:
1) fatiar:
Isso faz uma cópia da fatia de
a
e a atribui ab
.2) atribuição de fatias:
Isso substitui a fatia de
a
pelo conteúdo deb
.Embora a sintaxe seja semelhante (imagino pelo design!), Essas são duas operações diferentes.
fonte
start=1
,stop=None
. Isso evitará quaisquer cópias e usará avaliação preguiçosa (no seu caso, acesso preguiçoso à lista original).Ao especificar
a
no lado esquerdo do=
operador, você está usando a atribuição normal do Python , que altera o nomea
no contexto atual para apontar para o novo valor. Isso não altera o valor anterior para o quala
estava apontando.Ao especificar
a[0:2]
no lado esquerdo do=
operador, você está dizendo ao Python que deseja usar Slice Assignment . Atribuição de fatia é uma sintaxe especial para listas, onde você pode inserir, excluir ou substituir o conteúdo de uma lista:Inserção :
Exclusão :
Substituição :
Nota:
Slice Assignment fornece uma função semelhante à Tuple Unpacking . Por exemplo,
a[0:1] = [4, 5]
é equivalente a:Com Tuple Unpacking, você pode modificar listas não sequenciais:
No entanto, a descompactação da tupla é limitada à substituição, pois você não pode inserir ou remover elementos.
Antes e depois de todas essas operações,
a
é a mesma lista exata. Python simplesmente fornece uma ótima sintaxe para modificar uma lista no local.fonte
a[:] = some_list
equivalente aa = some_list[:]
oua = some_list
?a[:] = some_list
define cada elemento dea
para ser aquele desome_list
. Fazer qualquer um dos que você mencionou mudaria o quea
é. Por exemplo:a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. A última linha seria False se alterassea
o valor de, em vez de alterá-lo.Já me deparei com a mesma pergunta antes e ela está relacionada à especificação da linguagem. De acordo com as instruções de atribuição ,
Se o lado esquerdo da atribuição for assinatura, o Python irá chamar
__setitem__
esse objeto.a[i] = x
é equivalente aa.__setitem__(i, x)
.Se o lado esquerdo da atribuição for uma fatia, o Python também chamará
__setitem__
, mas com argumentos diferentes:a[1:4]=[1,2,3]
é equivalente aa.__setitem__(slice(1,4,None), [1,2,3])
É por isso que a fatia da lista no lado esquerdo de '=' se comporta de maneira diferente.
fonte
Ao fatiar no lado esquerdo de uma operação de atribuição, você especifica a quais itens atribuir.
fonte