2010-11-15 43 views

Respuesta

9

Python le permite " cortar "varios tipos de contenedores; esta es una notación abreviada para tomar una subcolección de una colección ordenada. Por ejemplo, si usted tiene una lista

foo = [1,2,3,4,5] 

y desea que los elementos segundo, tercero y cuarto, que puede hacer:

foo[1:4] 

Si se omite uno de los números en el corte, se predeterminado al comienzo de la lista. Así, por ejemplo,

foo[1:] == [2,3,4,5] 
foo[:4] == [1,2,3,4] 

Naturalmente, si omite ambos números en la sección obtendrá de vuelta la lista completa. Sin embargo, obtendrá una copia de la lista en lugar del original; de hecho, esta es la notación estándar para copiar una lista. Nótese la diferencia:

>>> a = [1,2,3,4] 
>>> b = a 
>>> b.append(5) 
>>> a 
[1, 2, 3, 4, 5] 
>>> 
>>> a = [1,2,3,4] 
>>> b = a[:] 
>>> b.append(5) 
>>> a 
[1, 2, 3, 4] 

Esto se debe a que b = ab dice que apunte al mismo objeto que a, así añadiendo a b es lo mismo que anexar a a. Copiando la lista a lo evita. Tenga en cuenta que esto solo tiene un nivel de indirección profunda: si a contiene una lista, por ejemplo, y usted anexó a esa lista en b, aún cambiaría a.

Por cierto, hay un tercer argumento opcional para el segmento, que es un paso parámetro - le permite moverse a través de la lista en saltos de más de 1. Así que podría escribir el rango (100) [ 0 :: 2] para todos los números pares hasta 100.

+1

o puede escribir el rango (0, 100, 2) –

+0

también se puede usar para asignar a un sector, por ejemplo 'a [2: 4] = [4,5,6,7,8]' –

5

Si self.var es , devolverá un shallow copy de esa secuencia.

Si self.var es una inmutable built-in sequence tales como string o una tuple, la mayoría de las implementaciones volverán self.var sí.

+0

-1 Si var se refiere a una secuencia ** mutable **, devolverá ** una referencia a ** una copia superficial de esa secuencia. Si var se refiere a una secuencia inmutable (por ejemplo, str, unicode, tupla), debería (por eficiencia) devolver la referencia original. –

+0

@John, la primera parte de tu comentario es técnicamente correcta, pero no estoy seguro de la segunda parte (mira el último enlace en mi respuesta). Además, creo que el que pregunta está más interesado por lo que el código realmente * hace * en lugar de lo que * debería * hacer :) –

+0

Amplificación de "debería": el segundo caso con CPython devolverá la referencia original para los objetos incorporados (porque el los implementadores no son tontos). No hay tal garantía para los objetos definidos por el usuario. "Sector compartido" (su último enlace) es irrelevante en el caso '[:]' que ya está "compartido" por implementaciones no tontas. –

2

Eso creará una copia superficial de la lista y la devolverá.

"Copia poco profunda", a diferencia de "copia profunda", significa que la lista solo creará nuevas copias de las referencias en ella, no los objetos reales. Es decir, se creará una nueva lista con las mismas referencias de objetos, pero los objetos mismos permanecerán iguales.

Si elimina un elemento del original, la nueva lista no se verá afectada, pero si modifica uno de los elementos dentro de la lista original (llamando a un método o configurando una propiedad del objeto, por ejemplo), el elemento también cambiará en la nueva lista, porque aunque son listas diferentes, apuntan a los mismos objetos.

+0

¿Quién dice que es una lista? Podría ser cualquier objeto que admita la operación de corte, p. Ej. un objeto xlm.etree.ElementTree.Element –

+0

Por supuesto, tienes razón. Podría haber dicho "cualquier objeto que implemente la funcionalidad de corte", pero creo que no habría ayudado, no es el punto de la cuestión, a mi entender, creo que la cuestión de la copia superficial o profunda era la parte importante. – slezica

2

Se llama lista de rebanar:

[de: a: saltar]

[a partir de: a]

Así que si digo:

list = range(20) 
print list[1:3] #returns [2, 3] 
print list[1:12:3] #returns [2, 5, 8, 11] 
print list[14:] #because theres no end: [15, 16, 17, 18, 19] 
print list[14:-2] #-2 from the end: [15, 16, 17] 
+0

Se llama cortar, una operación proporcionada por varios tipos diferentes de objetos. –

1

puede utilizar los operadores con una lista de las siguientes maneras:

lista

= [] 1,2,3,4,5,6,7,8,9

con una sola: en en el medio de los paréntesis se define el rango desde qué posición a qué posición elegir (posición de inicio es 0. entonces tengo las siguientes opciones

list [0: 3] muestra [1,2,3], porque comienza desde la posición del primer número y termina en la posición anterior al segundo número

lista [: 3] muestra lo mismo que antes, el primer número está ausente por lo que no hay límite de inicio

lista [5:] muestra la lista desde la quinta posición hasta el final [6,7,8,9]

Ahora, si x o y de la lista [x, y] es negativo, comienza si x es de la posición x y si es y termina de len (lista) -2 posición Por ejemplo: lista [- 1: 3] = [2,3]

Ahora puede tener 2: como [x: y: z] aquí x indica la celda inicial, y la última celda (que no está incluida en el rango devuelto) y z el paso en el que avanza la secuencia lista [0: 5: 2] = [0,2,4]