a_list = ['foo', 'bar']
Crea un nuevo list
en la memoria y señala el nombre a_list
en ella. Es irrelevante lo que a_list
señaló antes.
a_list[:] = ['foo', 'bar']
llama al método __setitem__
del objeto a_list
con un slice
como el índice, y un nuevo list
creado en la memoria como el valor.
__setitem__
evalúa el slice
para averiguar qué índices representa, y llama al iter
en el valor que se pasó. Luego itera sobre el objeto, estableciendo cada índice dentro del rango especificado por el slice
en el siguiente valor del objeto. Para list
s, si el rango especificado por slice
no es de la misma longitud que el iterable, se cambia el tamaño del list
. Esto le permite hacer una serie de cosas interesantes, como secciones de borrado de una lista:
a_list[:] = [] # deletes all the items in the list, equivalent to 'del a_list[:]'
o la inserción de nuevos valores en el medio de una lista:
a_list[1:1] = [1, 2, 3] # inserts the new values at index 1 in the list
Sin embargo, con "rebanadas extendidas" , donde el step
no es uno, el iterable debe ser la longitud correcta:
>>> lst = [1, 2, 3]
>>> lst[::2] = []
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: attempt to assign sequence of size 0 to extended slice of size 2
las principales cosas que son diferentes sobre la asignación rebanada a a_list
son:
a_list
ya debe apuntar a un objeto
- Ese objeto se modifica, en lugar de señalar
a_list
en un nuevo objeto
- Ese objeto debe ser compatible con
__setitem__
con un índice de slice
- El objeto de la derecha debe iteración de soporte
- No se señala ningún nombre en el objeto a la derecha. Si no hay otras referencias a la misma (como cuando es literal como en su ejemplo), será referencia contada fuera de existencia después de que se complete la iteración.
Me gustó especialmente la parte editada :) – 0xc0de
He leído esto en los documentos (http://docs.python.org/tutorial/introduction.html#lists). Solo el índice predeterminado era mi duda :) – 0xc0de
"Para las listas, si el rango especificado por el segmento no es de la misma longitud que el iterable, la lista cambia de tamaño". Esto es cierto solo si el valor de paso del rango es 1. Para valores de paso distintos de 1, el iterable asignado debe dar la cantidad correcta de elementos. –