Python: deepcopy(lista) vs new_list=lista_antigua
deep copy python (2)
Hiciste dos preguntas:
Copia profunda vs. poco profunda
matrix[:]
es una copia superficial : solo copia los elementos directamente almacenados en ella, y no duplica repetitivamente los elementos de las matrices u otras referencias dentro de sí mismo. Eso significa:
a = [[4]]
b = a[:]
a[0].append(5)
print b[0] # Outputs [4, 5], as a[0] and b[0] point to the same array
Lo mismo sucedería si almacenase un objeto en a
.
deepcopy()
es, naturalmente, una copia profunda : hace copias de cada uno de sus elementos recursivamente, a lo largo de todo el árbol:
a = [[4]]
c = copy.deepcopy(a)
a[0].append(5)
print c[0] # Outputs [4], as c[0] is a copy of the elements of a[0] into a new array
Regresando
return final.append(li)
es diferente de invocar append
y devolver final
porque list.append no devuelve el objeto de la lista en sí, devuelve None
Estoy haciendo el ejercicio n. ° 9 de http://openbookproject.net/thinkcs/python/english2e/ch09.html y me encontré con algo que no tiene sentido.
El ejercicio sugiere usar copy.deepcopy()
para facilitar mi tarea, pero no veo cómo podría hacerlo.
def add_row(matrix):
"""
>>> m = [[0, 0], [0, 0]]
>>> add_row(m)
[[0, 0], [0, 0], [0, 0]]
>>> n = [[3, 2, 5], [1, 4, 7]]
>>> add_row(n)
[[3, 2, 5], [1, 4, 7], [0, 0, 0]]
>>> n
[[3, 2, 5], [1, 4, 7]]
"""
import copy
# final = copy.deepcopy(matrix) # first way
final = matrix[:] # second way
li = []
for i in range(len(matrix[0])):
li.append(0)
# return final.append(li) # why doesn''t this work?
final.append(li) # but this does
return final
Estoy confundido por qué el libro sugiere usar deepcopy()
cuando una simple list[:]
copia. ¿Lo estoy usando mal? ¿Mi función está completamente fuera de wack?
También tengo cierta confusión al devolver los valores. la pregunta es documentos en el código de arriba.
TIA
Vea la documentación en una copia profunda y superficial .
list[:]
no crea copias de elementos anidados.
Para su problema con respecto a la declaración de devolución, parece que no está dentro de una función cuando la llama, supongo que sucedió al pegar el código aquí. En cuanto al valor de retorno, Michael Mrozek tiene razón.