Lista de tareas con

Cuál es la diferencia entre

list = range(100) 

y

 list[:] = range(100) 

en Python?

EDITAR

Debería haber mencionado que antes de que la variable de la lista de asignación ya estaba asignada a una lista:

 list = [1, 2, 3] list = range(100) 

o

 list = [1, 2, 3] list[:] = range(100) 

Cuando tu lo hagas

 lst = anything 

Estás apuntando el nombre lst a un objeto. No cambia el objeto antiguo al que lst apuntando de ninguna manera , aunque si nada más apunta a ese objeto, su recuento de referencia bajará a cero y se eliminará.

Cuando tu lo hagas

 lst[:] = whatever 

Está iterando sobre whatever , creando una tupla intermedia y asignando cada elemento de la tupla a un índice en el primer objeto ya existente . Eso significa que si varios nombres apuntan al mismo objeto, verá el cambio reflejado cuando haga referencia a cualquiera de los nombres, como si usara append o extend o cualquiera de las otras operaciones in situ.

Un ejemplo de la diferencia:

 >>> lst = range(1, 4) >>> id(lst) 74339392 >>> lst = [1, 2, 3] >>> id(lst) # different; you pointed lst at a new object 73087936 >>> lst[:] = range(1, 4) >>> id(lst) # the same, you iterated over the list returned by range 73087936 >>> lst = xrange(1, 4) >>> lst xrange(1, 4) # not a list, an xrange object >>> id(lst) # and different 73955976 >>> lst = [1, 2, 3] >>> id(lst) # again different 73105320 >>> lst[:] = xrange(1, 4) # this gets read temporarily into a tuple >>> id(lst) # the same, because you iterated over the xrange 73105320 >>> lst # and still a list [1, 2, 3] 

Cuando se trata de velocidad, la asignación de segmentos es más lenta. Consulte Uso de la memoria de asignación de porciones de Python para obtener más información sobre su uso de la memoria.

El primero redefine la list nombres incorporados para apuntar a alguna lista.

El segundo falla con TypeError: 'type' object does not support item assignment .

list[:] especifica un rango dentro de la lista, en este caso define el rango completo de la lista, es decir, la lista completa y los cambia. list=range(100) , por otra parte, borra el contenido original de la list y establece los nuevos contenidos.

Pero intente lo siguiente:

 a=[1,2,3,4] a[0:2]=[5,6] a # prints [5,6,3,4] 

Verás, cambiamos los dos primeros elementos con la tarea. Esto significa que, utilizando esta notación, puede cambiar varios elementos de la lista una vez.

list[:] solo funcionará si ya hay un objeto llamado list que permite la asignación de segmentos.

Además, no debe nombrar la list variables porque hay una list nombrada incorporada que es el tipo de list sí.

[:] también es útil para hacer una copia profunda de la lista.

 def x(l): f=l[:] g=l l.append(8) print "l", l print "g", g print "f", f l = range(3) print l #[0, 1, 2] x(l) #l [0, 1, 2, 8] #g [0, 1, 2, 8] #f [0, 1, 2] print l #[0, 1, 2, 8] 

La modificación de l se refleja en g (porque, ambos apuntan a la misma lista, de hecho, tanto g como l son solo nombres en python), no en f (porque es una copia de l)

Pero, en tu caso, no hace ninguna diferencia. (Sin embargo, no soy elegible para comentar sobre el uso de memoria de ambos métodos).

Editar

 h = range(3) id(h) #141312204 h[:]=range(3) id(h) #141312204 h=range(3) id(h) #141312588 

list [:] = range (100) actualiza la lista list = range (100) crea una nueva lista.

@agf: gracias por señalar mi error

 list[:] = range(100) 

no funcionará en una variable sin inicializar, ya que la está modificando. El [:] especifica la lista completa / touple.