OAN <programm...@toomuchcookies.net> writes: > Hi, > > i was having a problem with class attributes initiated outside of > __init__. This code is a demonstration of what i mean: > > class A(): > mylist = [] > def __init__(self): > self.mylist.append(1) > pass > > class B(A): > def __init__(self): > A.__init__(self) > self.mylist.append(2) > > v = A() > print 'v:',v.mylist > x = B() > print 'x:',x.mylist > y = B() > print 'y:',y.mylist > z = A() > print 'z:',z.mylist > print 'v:',v.mylist > > I would expect the following result: > > v: [1] > x: [1, 2] > y: [1, 2] > z: [1] > v: [1] > > Who wouldn't, right? But actually python 2.6(.6) gives me the > following result: > > v: [1] > x: [1, 1, 2] > y: [1, 1, 2, 1, 2] > z: [1, 1, 2, 1, 2, 1] > v: [1, 1, 2, 1, 2, 1] > > The four variables v,x,y and z now actually share the same 'mylist'!! > To get the correct results, i have to initialize 'mylist' inside of > the __init__ method!
Yes. See below. > I think this behaviour is totally wrong, since it seems > A.__init__(self) is changing the value inside of A() not inside of the > object variable 'self' (that should be x or y)!! It's not wrong at all. You expect "mylist" to behave as an instance attribute, but you defined it as a class attribute. Instance attributes are naturally initialised in the __init__() method. -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list