Data sticking around too long

Matimus mccredie at gmail.com
Wed Sep 6 18:07:34 EDT 2006


Someone correct me if I'm wrong (sometimes I get the terms mixed up)
but I believe that what you are seeing is due to 'number' being an
immutable type. This means that its value cannot be changed and thus
each assignment is effectively creating a new instance if int. I
believe lists are considered immutable also but since it is a container
type it behaves somewhat differently. I read a thread earlier that
addressed a similar issue but I can't find it now. I will post again if
I come accross it. Anyway, as a demonstration try this using python's
command line prompt:

>>> i = int()
>>> j = i
>>> j is i
True
### j and i are attributes that point to the same instance
>>> i = 1
>>> j is i
False
### assignment to I made a new instance and j and i are no longer the
same instance
>>> a = [0,1,2]
>>> b = a
>>> b is a
True
### the same is true for lists
>>> b = [0,1,3]
>>> b is a
False
>>> b = a
>>> b is a
True
### but since 'a' is a container its contents can be modified without
creating a new instance
>>> b[1] = 3
>>> b is a
True
>>> a
[0,3,2]
>>> b
[0,3,2]
>>> a.append(4)
>>> a
[0,3,2,4]
>>> b
[0,3,2,4]
>>> b is a
True

I hope this helps.

-Matt

CedricCicada at gmail.com wrote:
> Greetings again!
>
> There's something more to determining whether a class member is a class
> variable or an instance variable.  Here's a slightly expanded version
> of my last script:
>
> class ScannerCommand:
>     taskName = ''
>     scanList = []
>     number = 0
>
>     def __init__(self, data):
>         pass
> #        self.scanList = []
> #        self.scanList.append(data)
>
> if __name__ == '__main__':
>     c1 = ScannerCommand("c1")
>     c2 = ScannerCommand("c2")
>     c1.number = 1
>     c2.number = 2
>     c1.scanList.append("One")
>     c2.scanList.append("Two")
>     print "C1: " + str(c1.number)
>     for data in c1.scanList:
>         print "   " + data
>     print "C2: " + str(c2.number)
>     for data in c2.scanList:
>         print "   " + data
>
> And here's the output:
> C1: 1
>    One
>    Two
> C2: 2
>    One
>    Two
>
> Here, the two instances share the scanList list, as expected from
> previous discussions, but they have their own copies of the number
> variable.  Why is scanList a class variable but number an instance
> variable here?
>
> Good night, all!
> 
> Rob Richardson
> RAD-CON, Inc.
> Bay Village, OH




More information about the Python-list mailing list