Data sticking around too long

Larry Bates larry.bates at websafe.com
Wed Sep 6 16:56:19 EDT 2006


CedricCicada at gmail.com wrote:
> Skip and Matimus,
> 
> Thank you for your replies.  Putting initialization in the constructor
> gets me what I want.  But I'd like to understand this a bit more.
> Here's another script:
> 
> class ScannerCommand:
>     taskName = ''
>     scanList = []
> 
>     def __init__(self, data):
>         self.scanList = []
>         self.scanList.append(data)
> 
> if __name__ == '__main__':
>     c1 = ScannerCommand("c1")
>     c2 = ScannerCommand("c2")
>     print "C1: "
>     for data in c1.scanList:
>         print "   " + data
>     print "C2: "
>     for data in c2.scanList:
>         print "   " + data
> 
> And here's the output, which is what I want:
> C1:
>    c1
> C2:
>    c2
> 
> If scanList is a class variable shared between all instances of the
> class, then C1's list should have held "C2" when I printed it, since C2
> came along and changed scanList.  But obviously, here it's not a class
> variable and the two instances have their own lists.
> 
> If I don't initialize scanList in the constructor, then scanList is a
> class variable (in C++, it would be a static member of the class) that
> is shared among all instances of the class.  If I do initialize
> scanList in the constructor, then scanList magically becomes an
> instance variable, with every instance of the ScannerCommand object
> having its own scanList list???  Is that really the way it works?  I
> would have thought the C++ way, with some special syntax to distinguish
> a class variable from an instance variable, would be much easier to
> work with.
> 
> Thanks again!
> 
> Rob Richardson
> RAD-CON, Inc.
> Bay Village, OH
> 

You shadowed the class attribute scanList by creating an instance
variable called self.scanList in the __init__ method:

         self.scanList = []

Comment that line out and see what you get.

-Larry Bates



More information about the Python-list mailing list