¿Que significa?

95

Estoy analizando un código Python y no sé qué

pop = population[:]

medio. ¿Es algo así como listas de matrices en Java o como una matriz bidimensional?

andriy
fuente
1
Relacionado, borrar una lista solo es posible haciendo del pop [:] o pop [:] = [], no pop.clear () .. (como se hace con dicts).
Macke
Buena discusión SO sobre la porción de Python: stackoverflow.com/questions/509211/…
Scott C Wilson

Respuestas:

109

Es un ejemplo de notación de corte y lo que hace depende del tipo de population. Si populationes una lista, esta línea creará una copia superficial de la lista. Para un objeto de tipo tupleo a str, no hará nada (la línea hará lo mismo sin él [:]), y para una (digamos) matriz NumPy, creará una nueva vista de los mismos datos.

Sven Marnach
fuente
14
Por si acaso: el corte devuelve una copia superficial.
André Caron
4
@ilius: Tal vez l.copy()sea ​​más legible, pero no funcionará.
Sven Marnach
13
list(l)siempre funciona, es más legible y se garantiza que devolverá una copia incluso con algo comonumpy.array
Rosh Oxymoron
1
@Eli: Sí, al lado list.clear(). Sin embargo, tomará algún tiempo hasta que esto lleve a una reducción significativa de este tipo de preguntas sobre SO. :)
Sven Marnach
1
@MichaelGraczyk: Supongo que estás hablando de matrices NumPy aquí. En lugar de usar A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], casi siempre prefiero numpy.rollaxis(A, axis, 0)[k]. En general, rara vez me he encontrado con un caso de uso en el que necesite crear slice()objetos directamente . Si los necesita de todos modos, NumPy proporciona el s_asistente como una forma alternativa de crearlos.
Sven Marnach
27

También puede ser útil saber que un segmento de lista en general hace una copia de parte de la lista. Por ejemplo population[2:4], devolverá una lista que contiene la población [2] y la población [3] (el corte es exclusivo por la derecha). Dejando a un lado el índice izquierdo y derecho, ya population[:]que están predeterminados en 0 y longitud (población) respectivamente, seleccionando así la lista completa. Por lo tanto, este es un modismo común para hacer una copia de una lista.

ThomasH
fuente
15

bueno ... esto realmente depende del contexto. En última instancia, que pasa a un sliceobjeto ( slice(None,None,None)) a uno de los métodos siguientes: __getitem__, __setitem__o __delitem__. (En realidad, si el objeto tiene un __getslice__, se usará en lugar de __getitem__, pero ahora está en desuso y no debería usarse).

Los objetos pueden hacer lo que quieran con el corte.

En el contexto de:

x = obj[:]

Esto llamará obj.__getitem__con el objeto slice pasado. De hecho, esto es completamente equivalente a:

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

(aunque el primero es probablemente más eficiente porque no tiene que buscar el sliceconstructor, todo está hecho en código de bytes).

Para la mayoría de los objetos, esta es una forma de crear una copia superficial de una parte de la secuencia.

Próximo:

x[:] = obj

Es una forma de configurar los elementos (llama __setitem__) en función de obj.

y creo que probablemente puedas adivinar qué:

del x[:]

llamadas ;-).

También puedes pasar diferentes rodajas:

x[1:4]

constructos slice(1,4,None)

x[::-1]

construye slice(None,None,-1)y así sucesivamente. Lectura adicional: Explica la notación de corte de Python

mgilson
fuente
10

Es un corte desde el principio de la secuencia hasta el final, que generalmente produce una copia superficial.

(Bueno, es más que eso , pero no es necesario que te importe todavía).

Ignacio Vázquez-Abrams
fuente
6

Crea una copia de la lista, en lugar de simplemente asignar un nuevo nombre a la lista ya existente.

Jim Brissom
fuente
5

[:] se
usa para limitar o cortar en una matriz, hash,
por ejemplo:
[1: 5] para mostrar valores entre 1 incluido y 5 exclusivo, es decir, 1-4
[inicio: fin]

básicamente se usa en una matriz para cortar, entienda el corchete aceptar la variable que significa valor o clave para mostrar, y ":" se usa para limitar o dividir la matriz completa en paquetes.

Vijay Balkrishna konduskar
fuente
1
No hay razón para chocar con una pregunta tan antigua que ya tiene 5 respuestas similares e incluso una aceptada ... Además, a[1:5]devuelve los elementos 1-4, no 2-4.
Skamah One
@SkamahOne Oh, no lo sé. Quizás no en este caso, pero hay ocasiones en las que puede ser útil plantear preguntas muertas. Perspectiva diferente, redacción diferente, etc. En este caso, corrigió la respuesta y, con suerte, ellos también aprendieron algo.
Pryftan