On Fri, 03 Dec 2010 22:54:19 +0100, OAN wrote: > Hi, > > i was having a problem with class attributes initiated outside of > __init__. This code is a demonstration of what i mean: [...] > I would expect the following result: > > v: [1] > x: [1, 2] > y: [1, 2] > z: [1] > v: [1] > > Who wouldn't, right?
Everybody who actually understands Python's object model. > 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! Right. If you define a *class* attribute, it lives in the class, not the instance, and so all instances share the same value. > 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)!! A.__init__(self) calls A's init method with self (either x or y) as the self parameter, but A's init method merely modifies the class attribute mylist in place. It doesn't create a new list. The behaviour you're seeing is no different from this: shared = [] a = {"spam": shared, "ham": 23} b = {"spam": shared, "ham": 42} a["spam"].append("parrot") What would you expect the value of b["spam"] to be? -- Steven -- http://mail.python.org/mailman/listinfo/python-list