python

¿Cuál es la diferencia entre list y list[:] en python?



python zip list (6)

¿Cuál es, si hay alguna, la diferencia entre list y list[:] en python?


Al leer, la list es una referencia a la lista original y list[:] copia poco profunda de la lista.

Al asignar, list (re) vincula el nombre y list[:] slice-assigns, reemplazando lo que estaba previamente en la lista.

Además, no use la list como nombre ya que sombrea la función incorporada.


Aplicar la primera list a una variable creará una referencia a la lista original. La segunda list[i] creará una copia superficial.

por ejemplo:

foo = [1,2,3] bar = foo foo[0] = 4

bar y foo ahora serán:

[4,2,3]

pero:

foo = [1,2,3] bar = foo[:] foo[0] = 4

resultado será:

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

: es cortar


Este último es una referencia a una copia de la lista y no una referencia a la lista. Entonces es muy útil.

>>> li = [1,2,3] >>> li2 = li >>> li3 = li[:] >>> li2[0] = 0 >>> li [0, 2, 3] >>> li3 [1, 2, 3]


Sin embargo, si los elementos de la lista son listas, incluso list1 = list[:] tiene sus problemas. Considerar:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] >>> b = a[:] >>> b[0].remove(2) >>> b [[1, 3], [4, 5, 6], [7, 8, 9]] >>> a [[1, 3], [4, 5, 6], [7, 8, 9]]

Esto sucede porque cada elemento de lista que se copia a b es una lista en sí misma, y ​​esta copia de listas implica el mismo problema que ocurre con la list1 = list2 . La salida más corta que he encontrado es copiar explícitamente cada elemento de la lista de esta manera:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] >>> b=[[j for j in i] for i in a] >>> b [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> b[0].remove(2) >>> b [[1, 3], [4, 5, 6], [7, 8, 9]] >>> a [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Por supuesto, por cada grado adicional de anidación en la lista anidada, el código de copia se profundiza por un bucle for línea adicional.


li [:] crea una copia de la lista original. Pero no se refiere al mismo objeto de lista. Por lo tanto, no se arriesga a cambiar la lista original cambiando la copia creada por li [:].

por ejemplo:

>>> list1 = [1,2,3] >>> list2 = list1 >>> list3 = list1[:] >>> list1[0] = 4 >>> list2 [4, 2, 3] >>> list3 [1, 2, 3]

Aquí list2 se cambia cambiando la list1 pero list3 no cambia.


El primero hace referencia a la lista original. El segundo apunta a la copia de la lista original.
¡Mira esto!

>>> a = [1, 2, 3] >>> b = a >>> c = a[:] >>> a == b True >>> a is b True >>> a == c True >>> a is c False >>> a.__repr__ <method-wrapper ''__repr__'' of list object at 0x7f87a9ba3688> >>> a.__repr__() ''[1, 2, 3]'' >>> b.__repr__ <method-wrapper ''__repr__'' of list object at 0x7f87a9ba3688> >>> c.__repr__ <method-wrapper ''__repr__'' of list object at 0x7f87ad352988>

Observe que tanto a como b apuntan a la dirección 0x7f87a9ba3688 , mientras que, c apunta a 0x7f87ad352988 .
La diferencia es clara como el cristal.
Tanto a como b hacen referencia al objeto de la lista original.
Considerando que, c apunta a la copia (de la lista original) y, por lo tanto, está en una ubicación diferente.