deepcopy python list copy

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.