2009-06-04 16 views
10

estoy tratando de modificar una lista y ya que mis modificaciones estaban recibiendo un poco complicado y mi lista grande Tomé un trozo de mi lista usando el siguiente códigoSi cortar no crea una copia de una lista ni lista() ¿cómo puedo obtener una copia real de mi lista?

tempList=origList[0:10] 
for item in tempList: 
    item[-1].insert(0 , item[1]) 
    del item[1] 

hice esta forma de pensar que todas las modificaciones a la lista afectaría a los objetos tempList y no a los objetos origList.

Bueno, una vez que obtuve mi código correcto y lo ejecuté en mi lista original, los primeros diez elementos (indexados 0-9) se vieron afectados por mi manipulación al probar el código impreso anteriormente.

Así que lo busqué en Google y encuentro referencias que dicen que al tomar una porción se copia la lista y se crea una nueva. También encontré código que me ayudó a encontrar la identificación de los artículos, así que creé mi origList desde cero, obtuve los identificadores de los primeros diez artículos. Corté la lista de nuevo y descubrí que los identificadores de las divisiones coincidían con los ID de los primeros diez ítems de la lista original.

me pareció más notas que sugerían una forma más Pythonic para copiar una lista sería utilizar

tempList=list(origList([0:10]) 

lo he intentado y me sigue pareciendo que los identificadores de la tempList coinciden con los identificadores de la origList.

Por favor, no hay mejores formas de hacer la codificación-Voy a encontrar la manera de hacer esto en una lista por comprensión por mi cuenta después de que entiendo lo cómo funciona la copia

Sobre la base de la respuesta de Kai la correcta método es:

import copy 
tempList=copy.deepcopy(origList[0:10]) 
id(origList[0]) 
>>>>42980096 
id(tempList[0]) 
>>>>42714136 

funciona como un encanto

Respuesta

24

rebanar crea una copia superficial. En su ejemplo, veo que está llamando a insert() en el elemento [-1], lo que significa que el elemento es una lista de listas. Eso significa que tus copias superficiales aún hacen referencia a los objetos originales. Puedes pensar que está haciendo copias de los punteros, no de los objetos reales.

Su solución consiste en utilizar copias en profundidad. Python proporciona un copy module solo para este tipo de cosas. Encontrará mucha más información sobre la copia poco profunda frente a la profunda cuando la busca.

+0

Muy útil-google surgió con profundo versus poco profundo de inmediato. Gracias. – PyNEwbie

4

Si copia un objeto, el contenido del mismo no se copiará. En la mayoría de los casos, esto es lo que quieres. En su caso, debe asegurarse de que los contenidos sean copiados por usted mismo. Puede usar copy.deepcopy, pero si tiene una lista de listas o algo similar, recomendaría usar copy = [l[:] for l in list_of_lists], eso debería ser mucho más rápido.

Una pequeña nota a su codestyle:

  • Del es una declaración y no una función por lo que es mejor no usar parens allí, no son más que confuso.
  • Los espacios en blanco alrededor de los operadores y después de las comas harían que su código sea más fácil de leer.
  • list (alist) copia una lista pero no es más pitthonic que alist [:], creo que alist [:] es aún más común que la alternativa.
+0

del-Yo no sabía eso y después de probar eso y luego probar algunas funciones (id) descubrí cómo diferenciar entre las declaraciones y las funciones. Encontré un código con del y usaron parens. Su código me dio nuevos identificadores para que copie profundamente mi lista cuando lo hice: newl = [tempList [:] para el elemento en origList [0:10]]. copy.deepcopy parece más fácil. No dije que era más hethry python. Precheur.org dijo que sí. Pero gracias, aprendí algo – PyNEwbie

Cuestiones relacionadas