2010-02-04 8 views
20

Estoy tratando de agregar un objeto a una lista, pero dado que estoy agregando el objeto real cuando intento restablecer la lista posteriormente, se restablecen todos los valores en la lista. ¿Existe una forma real de cómo puedo agregar un objeto de monitor a la lista y cambiar los valores y no afectar los que ya he guardado en la lista?Agregar un objeto a una lista de Python

Gracias

Código:

arrayList = [] 

for x in allValues: 


     result = model(x) 

     arrayList.append(wM) 

     wM.reset() 

donde wM es una clase de monitor - que está siendo calculado/trabajado en el método modelo

+3

No entiendo su problema. Algún código simple que muestre qué está yendo mal podría ayudar. –

+3

¿Qué es una "lista de matriz"? ¿Una 'lista'? –

+0

sí, es una lista. – Lilz

Respuesta

20

¿Su problema es similar a esto:

l = [[0]] * 4 
l[0][0] += 1 
print l # prints "[[1], [1], [1], [1]]" 

Si es así, sólo hay que copiar los objetos cuando se los almacena:

import copy 
l = [copy.copy(x) for x in [[0]] * 4] 
l[0][0] += 1 
print l # prints "[[1], [0], [0], [0]]" 

Los objetos en cuestión deben implementar un __copy__ método para copiar objetos. Consulte la documentación para copy. También puede estar interesado en copy.deepcopy, que también está allí.

EDIT: Aquí está el problema:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(wM) # appends the wM object to the list 
    wM.reset()   # clears the wM object 

Es necesario anexar una copia:

import copy 
arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(copy.copy(wM)) # appends a copy to the list 
    wM.reset()      # clears the wM object 

pero todavía estoy confundido en cuanto a donde wM está viniendo. ¿No solo va a copiar el mismo objeto wM una y otra vez, excepto que lo borre después de la primera vez para que todo el resto esté vacío? ¿O model() modifica el wM (que me parece un defecto de diseño terrible)? ¿Y por qué estás tirando result?

+0

+1 Supongo que el problema de OP se relaciona con este – ghostdog74

+0

MUCHAS GRACIAS TANTO :) – Lilz

+0

@Lily - Si hubieras leído y pensado acerca de mi respuesta original o la respuesta de ghostdog74, podrías haberlo hecho por tu cuenta. Debería considerar leer la documentación, particularmente sobre los objetos inmutables frente a los mutables y el módulo 'copy'. –

2

mientras usted debe mostrar cómo el código tiene que da el problema, creo que este escenario es muy común. Ver copy/deepcopy

+0

+1 por golpearme. –

3

Debe crear una copia de la lista antes de modificar su contenido. Un atajo rápido para duplicar una lista es la siguiente:

mylist[:] 

Ejemplo:

>>> first = [1,2,3] 
>>> second = first[:] 
>>> second.append(4) 
>>> first 
[1, 2, 3] 
>>> second 
[1, 2, 3, 4] 

Y para mostrar el comportamiento por defecto que modifique la lista orignal (ya un nombre en Python es sólo una referencia a la objeto subyacente):

>>> first = [1,2,3] 
>>> second = first 
>>> second.append(4) 
>>> first 
[1, 2, 3, 4] 
>>> second 
[1, 2, 3, 4] 

Tenga en cuenta que esto solo funciona para las listas. Si necesita duplicar el contenido de un diccionario, debe usar copy.deepcopy() según lo sugerido por otros.

0

Si estoy en lo cierto al creer que está agregando una variable a la matriz, pero cuando la cambia fuera de la matriz, también cambia dentro de la matriz pero no la quiere, entonces es realmente simple solución.

Cuando guarde la variable en la matriz, conviértala en una cadena simplemente colocando str (nombre de variable).Por ejemplo:

array.append(str(variablename)) 

Usando este método el código debería tener este aspecto:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(str(wM))  #this is the only line that is changed. 
    wM.reset() 
+0

Esto me da un error. –

Cuestiones relacionadas