tags:

views:

148

answers:

3

Hi

I am trying to add an object to an array list but since I'm adding the actual object when I try to reset the array thereafter, all the values in the array are reset. Is there an actual way how I can add a monitor object to the array and change the values and not affect the ones I've already saved in the array?

Thanks

Code:

arrayList = []

for x in allValues:


        result = model(x)

        arrayList.append(wM)

        wM.reset()

where wM is a monitor class - whihc is being calculated / worked out in the model method

+1  A: 

while you should show how your code looks like that gives the problem, i think this scenario is very common. See copy/deepcopy

ghostdog74
+1 for beating me.
Chris Lutz
+4  A: 

Is your problem similar to this:

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

If so, you simply need to copy the objects when you store them:

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

The objects in question should implement a __copy__ method to copy objects. See the documentation for copy. You may also be interested in copy.deepcopy, which is there as well.

EDIT: Here's the 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

You need to append a copy:

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

But I'm still confused as to where wM is coming from. Won't you just be copying the same wM object over and over, except clearing it after the first time so all the rest will be empty? Or does model() modify the wM (which sounds like a terrible design flaw to me)? And why are you throwing away result?

Chris Lutz
+1 I am guessing OP's problem relates to this
ghostdog74
THANK YOU SO SO SO MUCH :)
Lily
@Lily - If you had read and thought about either my original answer or ghostdog74's answer, you could have done this on your own. You should consider reading the documentation, particularly about immutable vs. mutable objects and the `copy` module.
Chris Lutz
Great answer, Mr. Lutz!
jathanism
A: 

You need to create a copy of the list before you modify its contents. A quick shortcut to duplicate a list is this:

mylist[:]

Example:

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

And to show the default behavior that would modify the orignal list (since a name in Python is just a reference to the underlying object):

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

Note that this only works for lists. If you need to duplicate the contents of a dictionary, you must use copy.deepcopy() as suggested by others.

jathanism