2012-06-09 11 views
6
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> u = [4, 5, 6, 7, 8, 9] 
>>> u[1::1] = [3, 2, 1, 0] 
>>> u 
[4, 3, 2, 1, 0] 
>>> u[9:0:-1] = [8, 7, 6, 5] 
>>> u 
[4, 5, 6, 7, 8] 
>>> u[9:0:-1] = [16, 12, 8] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 3 to extended slice of size 4 
>>> u 
[4, 5, 6, 7, 8] 
>>> 

Comportamiento esperado: ninguna excepción arrojada en la declaración de asignación final; u debe imprimir en la línea final como [4, 8, 12, 16].¿Por qué no puedo asignar un iterable arbitrario a un segmento extendido cuyo paso es -1?

Puedo asignar un segmento extendido cuyo paso es 1, incluso si el iterable que estoy asignando es "la longitud incorrecta". ¿Por qué entonces no puedo asignar a una porción extendida cuyo paso es -1 y hacer que funcione de la manera obvia?

Respuesta

3

Creo que la creación de una porción extendida cuyo paso es 1 actúa eficazmente como una porción regular en lugar de una porción extendida.

rebanadas extendidas no le permiten cambiar la longitud de la secuencia, como se ha señalado here

Si usted tiene una secuencia mutable como una lista o una matriz puede asignar o eliminar una rebanada extendida, pero hay algunas diferencias entre la asignación a sectores extendidos y regulares. La asignación a una división regular se puede usar para cambiar la duración de la secuencia. Las rebanadas extendidas no son tan flexibles. Cuando se asigna a una porción extendida, la lista en el lado derecho de la declaración debe contener la misma cantidad de elementos que la porción que está reemplazando.

En cuanto a por qué es funciona de esta manera, sólo puedo supongo que es debido a los casos en los que no hay ningún comportamiento obvia. Tome este ejemplo:

u = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 
u[0:8:3] = [ 10, 11 ] 

¿Cómo puede esperar que esto funcione? Supongo que podría reemplazar 1 & 4 con 10 & 11, pero ¿qué tal 7? ¿Lo dejas? ¿Bórralo? Eliminar el resto de la secuencia pasado 7? Tal vez soy solo yo, pero este caso no parece muy claro. Lo que supondría es por qué este tipo de comportamiento simplemente no estaba permitido para rebanadas extendidas.

+2

Tiene sentido. Aún así, el OP tiene razón en que para un paso de -1 el comportamiento esperado es bastante claro, por lo que podría ser agradable tener ese modo especial como lo es un paso de 1 ... – weronika

+0

@weronika De acuerdo, pero dígales que los desarrolladores de python;) – obmarg

Cuestiones relacionadas