¿Cuál es, en su caso, la diferencia entre list
y list[:]
en python?¿Cuál es la diferencia entre list y list [:] en python?
Respuesta
Al leer, list
es una referencia a la lista original, y list[:]
poco profundas-copia la lista.
Al asignar, list
(re) enlaza el nombre y list[:]
slice-assigns, reemplazando lo que estaba previamente en la lista.
Además, no utilice list
como nombre ya que sombrea la función incorporada.
La última es una referencia a una copia de la lista y no 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]
Aplicar la primera list
a una variable creará una referencia a la lista original. El segundo list[i]
creará una copia poco profunda.
por ejemplo:
foo = [1,2,3]
bar = foo
foo[0] = 4
bar y foo será ahora:
[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.
Sin embargo, si los elementos de la lista son listas, incluso list1 = list[:]
tiene sus problemas. Considere:
>>> 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 la lista que se copia a b es una lista en sí, y esta copia de las listas implica el mismo problema que ocurre con la normal list1 = list2
. El camino más corto a cabo que he encontrado es copiar de manera explícita 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 copiado profundiza por un adicional en línea for
loop.
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 list1
pero list3
no cambia.
- 1. ¿Cuál es la diferencia entre list [-1:] [0] y list [len (list) -1]?
- 2. ¿Cuál es la diferencia entre Collection y List en Java?
- 3. ¿Cuál es la diferencia entre @ + id/android: list y @ + id/list
- 4. ¿Cuál es la diferencia entre IEnumerable y Array, IList y List?
- 5. List.empty vs. List() vs. new List()
- 6. ¿Cuál es la diferencia entre "git whatchanged - filename" y "git rev-list - filename"
- 7. Python list transpose y fill
- 8. En Python, ¿cuál es la diferencia entre pasar y devolver
- 9. Diferencia entre list.First(), list.ElementAt (0) y list [0]?
- 10. ¿Cuál es la diferencia entre List <string> e IEnumerable <String>?
- 11. Python list issue
- 12. ¿Cuál es la diferencia entre :: ::: y en Scala
- 13. boost :: python :: list length
- 14. Python: ¿Cuál es la diferencia entre __builtin__ y __builtins__?
- 15. PHP list() equivalente en Python
- 16. ¿Tiene Haskell List Slices (es decir, Python)?
- 17. ¿Cuál es la diferencia entre EqualTo() y EquivalentTo() en NUnit?
- 18. ¿Cuál es la diferencia entre python activo y python?
- 19. Diferencias entre IQueryable, List, IEnumerator?
- 20. ¿Cuáles son las diferencias entre List, Dictionary y Tuple en Python?
- 21. ¿Cuál es la diferencia entre listas y tuplas en Python?
- 22. ¿Cuál es la diferencia entre conjuntos y listas en Python?
- 23. ¿Cuál es la diferencia entre {} y [] en python?
- 24. En Python, ¿cuál es la diferencia entre ".append()" y "+ = []"?
- 25. ¿Cuál es la diferencia entre dict() y {}?
- 26. ¿Cuál es la diferencia entre '() y (lista) en Clojure?
- 27. Python numpy array vs list
- 28. Boost Intrusive List hook
- 29. ¿Cuál es la diferencia entre 'a' y '_l?
- 30. Twisted (Python): ¿cuál es la diferencia entre cooperate y coiterate?
Esto tendrá graves problemas si tiene niveles diferentes o desconocidos de anidamiento en su lista externa ('i' puede no ser iterable) Si tiene listas anidadas, debe usar la [copia] (http: // docs.python.org/library/copy.html), use 'b = copy.deepcopy (a)' en lugar de bucles anidados. – RoundTower
^¡Gracias por el consejo! –