¿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.