Problem when subclass instance changes base class instance variable

Gerry Sutton gerryandsharon at sympatico.ca
Fri Apr 15 23:55:41 EDT 2005


Hi All!

I have noticed a strange behavior when using a constant identifier to 
initialize an instance list variable in a base class and then trying to 
modifying the list in subclasses by using either the list.extend method or 
even by having the subclass create a whole new list in the variable.

The following example illustrates the situation.



Lbase = ['Initial Base Data']

LSub1 = ['SubClass 1 data']

LSub2 = ['SubClass 2 data']



##

class BaseClass:



def __init__(self):

   self.data = Lbase                 #<----  this fails??

#  self.data = ['Initial Base Data'] #<----  this works

   def printData(self):

   print self.data



##

class SubClass1(BaseClass):



  def __init__(self):

   BaseClass.__init__(self)

   self.data.extend(LSub1)

# self.data += LSub1



##

class SubClass2(BaseClass):



  def __init__(self):

    BaseClass.__init__(self)

    self.data.extend(LSub2)

#   self.data += LSub2



s1 = SubClass1()

s1.printData()



s2 = SubClass2()

s2.printData()



s11 = SubClass1()

s11.printData()



s21 = SubClass2()

s21.printData()

s1.printData()



>>>

['Initial Base Data', 'SubClass 1 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1 
data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1 
data', 'SubClass 2 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1 
data', 'SubClass 2 data']

>>>

It looks like the instance variable is acting like a class variable with all 
the subclass changes accumulating as more objects are created.

Does anyone have an explanation for this behavior?

Are other mutable sequence types affected the same way?

To fix the problem you simply use a literal list to initialize the variable 
in the base class instead of an identifier.

This problem does not exist if the data variable is a string, maybe because 
it is immutable?

I am using Python Ver 2.3.

Does this code behave the same way in 2.4,









More information about the Python-list mailing list