# Help! This is driving me insane!

Bengt Richter bokr at oz.net
Thu Sep 26 22:53:55 EDT 2002

```On Thu, 26 Sep 2002 23:43:33 GMT, "kara.klosterman" <kara.klosterman at attbi.com> wrote:

>Hello,
>I created a very simple class that totals some data
>but I am not getting the output from it that I would
>expect at all.
>Here is the class:
>http://www.geocities.com/dbasch/insane.txt
>
>I would expect to get:
>[0, 0]
>[0, 0]
>[[0, 0]]
>
Why?

>but I am getting:
>[0, 0]      <<--(a)
>[0, 0]      <<--(b)
>[[1, 1]]    <<--(c)
>
Why not? [I labeled the above (a) etc. for reference below].

>I dont understand how the 'grouptotals' list is
>getting the incremented values prior to the
>'grouptotalcounter' function being called.
What makes you think it is? The value you printed at (b) shows it's not.

>furthermore, I can place a 'print grouptotals' right
>after the errorlog append and it isnt the incremented
>values! Please tell me this isnt a normal thing!

Did you walk through the code and think through what
is happening?

class Test:
def __init__(self):
self.errorlog = []
pass

def run(self):
self.grouptotals = []
for x in range(2):
self.grouptotals.append(0)

print self.grouptotals                    <<--(a), should be [0, 0]
self.errorlog.append(self.grouptotals)    <<-- self.errorlog now [[0, 0]]
print self.grouptotals                    <<--(b), no change, still [0, 0]

self.grouptotalcounter()                  <<-- self.grouptotals changed to [1, 1]
(note that self.errorlog still refers to
the now changed self.grouptotals)

return self.errorlog                      <<-- ref to changed grouptotals makes it [[1, 1]]
but there is no print statement. Reference to
self.errorlog is returned to caller (d) below
of the run method.

def grouptotalcounter(self):
for totalbyindex in range(2):
self.grouptotals[totalbyindex] += 1   <<-- [0, 0] becomes [1, 1] here

If you put the above in insane.py and interactively made an instance thus:

>>> import insane
>>> t=insane.Test()
>>> t.run()               # <<--(d)
[0, 0]
[0, 0]
[[1, 1]]

that last line is the return value from t.run() being printed by the interactive
eval/print loop.

Everything as one would expect from the code.

Regards,
Bengt Richter

```