O que significa?

95

Estou analisando alguns códigos Python e não sei o que

pop = population[:]

significa. É algo como listas de array em Java ou como um array bidimensional?

andriy
fonte
1
Relacionado, limpar uma lista só é possível fazendo del pop [:] ou pop [:] = [], não pop.clear () .. (como você faz com dicts).
Macke
Boa discussão de SO sobre fatia Python: stackoverflow.com/questions/509211/…
Scott C Wilson

Respostas:

109

É um exemplo de notação de fatia e o que ela faz depende do tipo de population. Se populationfor uma lista, esta linha criará uma cópia superficial da lista. Para um objeto do tipo tupleou a str, não fará nada (a linha fará o mesmo sem [:]), e para um (digamos) array NumPy, criará uma nova visualização para os mesmos dados.

Sven Marnach
fonte
14
Por precaução: a fatia retorna uma cópia rasa.
André Caron
4
@ilius: Talvez l.copy()seja mais legível, mas não funcionará.
Sven Marnach
13
list(l)sempre funciona, é mais legível e com garantia de devolução de uma cópia mesmo com algo comonumpy.array
Rosh Oxymoron
1
@Eli: Sim, ao lado list.clear(). Levará algum tempo, porém, até que isso leve a uma redução significativa desse tipo de perguntas sobre o SO. :)
Sven Marnach
1
@MichaelGraczyk: Presumo que você esteja falando sobre matrizes NumPy aqui. Em vez de usar A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], quase sempre prefiro numpy.rollaxis(A, axis, 0)[k]. Em geral, raramente me deparei com um caso de uso em que você precise criar slice()objetos diretamente . Se você precisar deles de qualquer maneira, o NumPy fornece o s_auxiliar como uma forma alternativa de criá-los.
Sven Marnach
27

Também pode ajudar saber que uma fatia da lista em geral faz uma cópia de parte da lista. Por exemplo population[2:4], retornará uma lista contendo população [2] e população [3] (o fatiamento é exclusivo de direito). Deixando de lado o índice da esquerda e da direita, já population[:]que o padrão é 0 e comprimento (população) respectivamente, selecionando assim a lista inteira. Portanto, este é um idioma comum para fazer uma cópia de uma lista.

ThomasH
fonte
15

bem ... isso realmente depende do contexto. Em última análise, uma vez que passa um sliceobjecto ( slice(None,None,None)) para um dos seguintes métodos: __getitem__, __setitem__ou __delitem__. (Na verdade, se o objeto tiver um __getslice__, ele será usado em vez de__getitem__ , mas agora está obsoleto e não deve ser usado).

Os objetos podem fazer o que quiserem com a fatia.

Dentro do contexto de:

x = obj[:]

Isso irá chamar obj.__getitem__com o objeto de fatia passado. Na verdade, isso é completamente equivalente a:

x = obj[slice(None,None,None)]

(embora o primeiro seja provavelmente mais eficiente porque não tem que procurar o slice construtor - é tudo feito em bytecode).

Para a maioria dos objetos, essa é uma maneira de criar uma cópia superficial de uma parte da sequência.

Próximo:

x[:] = obj

É uma maneira de definir os itens (ele chama __setitem__) com base emobj .

e acho que você provavelmente pode adivinhar o que:

del x[:]

chamadas ;-).

Você também pode passar fatias diferentes:

x[1:4]

constrói slice(1,4,None)

x[::-1]

constrói slice(None,None,-1)e assim por diante. Leitura adicional: Explique a notação de fatia do Python

mgilson
fonte
10

É um corte do início ao fim da sequência, geralmente produzindo uma cópia superficial.

(Bem, é mais do que isso , mas você não precisa se preocupar ainda.)

Ignacio Vazquez-Abrams
fonte
6

Ele cria uma cópia da lista, em vez de apenas atribuir um novo nome para a lista já existente.

Jim Brissom
fonte
5

[:]
usado para limitador ou corte na matriz, hash,
por exemplo:
[1: 5] para exibir valores entre 1 inclusivo e 5 exclusivo, ou seja, 1-4
[início: fim]

basicamente usado na matriz para cortar, entender a variável de aceitação de colchetes que significa valor ou chave para exibir e ":" é usado para limitar ou dividir todo o array em pacotes.

Vijay Balkrishna konduskar
fonte
1
Não há razão para esbarrar em uma questão tão antiga que já tem 5 respostas semelhantes e até mesmo uma aceita ... Além disso, a[1:5]retorna os elementos 1-4, não 2-4.
Skamah One
@SkamahOne Oh, não sei. Talvez não neste caso, mas há momentos em que pode ser útil levantar questões mortas. Percepções diferentes, palavras diferentes, etc. Nesse caso, você corrigiu a resposta e, com sorte, eles também aprenderam algo.
Pryftan