2010-02-04 25 views
20

Próbuję dodać obiekt do listy, ale ponieważ dodam rzeczywisty obiekt, gdy próbuję zresetować listę później, wszystkie wartości na liście są resetowane. Czy istnieje rzeczywisty sposób dodania obiektu monitora do listy i zmiany wartości i nie wpływać na te, które już zostały zapisane na liście?Dodawanie obiektu do listy Pythona

Dzięki

Kod:

arrayList = [] 

for x in allValues: 


     result = model(x) 

     arrayList.append(wM) 

     wM.reset() 

gdzie wm klasy monitor - który jest obliczany/wypracowane w metodzie modelu

+3

Nie rozumiem problemu. Pomocny może być prosty kod pokazujący, co dzieje się źle. –

+3

Co to jest "lista tablic"? "Lista"? –

+0

tak, jest to lista. – Lilz

Odpowiedz

20

Czy Twój problem podobny do tego:

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

Jeżeli tak, wystarczy skopiować obiekty kiedy je przechowywać:

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

Obiekty te powinny wdrożyć __copy__ metoda kopiowania obiektów. Zobacz dokumentację dla copy. Możesz być także zainteresowany copy.deepcopy, który również tam jest.

EDIT: Tutaj jest problem:

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

Musisz dołączyć kopię:

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 

ale nadal jestem mylić, gdzie wM pochodzi. Czy po prostu nie będziesz po prostu kopiował tego samego obiektu wM, z wyjątkiem usuwania go po pierwszym czasie, aby cała reszta była pusta? Lub czy model() modyfikuje wM (co brzmi jak straszna wada projektowa do mnie)? I dlaczego wyrzucasz result?

+0

+1 Zgaduję, że problem OP odnosi się do tego – ghostdog74

+0

DZIĘKUJĘ WIĘC TAK TAK TAK DUŻO :) – Lilz

+0

@Lily - Gdybyś przeczytał i pomyślał o mojej oryginalnej odpowiedzi lub odpowiedzi ghostdog74, mógłbyś to zrobić na własną rękę. Powinieneś rozważyć przeczytanie dokumentacji, w szczególności na temat niezmiennych vs. zmiennych obiektów i modułu 'copy'. –

2

gdy trzeba pokazać, jak Twój kod wygląda tak daje problem, myślę, że ten scenariusz jest bardzo powszechny. Zobacz copy/deepcopy

+0

+1 za pokonanie mnie. –

3

Należy utworzyć kopię listy przed zmodyfikowaniem jej zawartości. Szybki skrót odtworzyć listę to:

mylist[:] 

Przykład:

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

i pokazać domyślnego zachowania, które byłoby zmodyfikować listę Orignal (od nazwy w Pythonie jest tylko odniesienie do obiekt bazowy):

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

Należy zauważyć, że działa to tylko dla list. Jeśli chcesz zduplikować zawartość słownika, musisz użyć copy.deepcopy() zgodnie z sugestią innych osób.

0

Jeśli mam rację, uważam, że dodajesz zmienną do tablicy, ale gdy zmienisz tę zmienną poza tablicą, zmieni się ona również wewnątrz tablicy, ale nie chcesz tego, wtedy jest to naprawdę proste rozwiązanie.

Zapisując zmienną do tablicy, należy zamienić ją w łańcuch, umieszczając po prostu str (variablename).Na przykład:

array.append(str(variablename)) 

Stosując tę ​​metodę Twój kod powinien wyglądać tak:

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

Daje mi to błąd. –

Powiązane problemy