In my mind all Python variables are some kind of "named pointers", I find that thinking this way helps me a lot in understanding what I'm doing. I know that this is not completely technically correct as in the first two examples there is actually a new a.i/a.arr created that shadows A.i, but thinking like this helps me. Are there fundamental flaws to think this way?
Example: >>>class A: i = 0 ## Class A has a pointer named i pointing to (int 0 object) ## A.i -> (int 0 object) >>>a = A() ## point a.i to the same thing A.i points to ## A.i -> (int 0 object) ## a.i -> (int 0 object) >>>b = A() ## point b.i to the same thing A.i points to ## A.i -> (int 0 object) ## a.i -> (int 0 object) ## b.i -> (int 0 object) >>>a.i = 1 ## point a.i to a new (int object) ## A.i -> (int 0 object) ## b.i -> (int 0 object) ## a.i -> (int 1 object) >>>class A: arr = [] ## A.i -> (empty list object) >>>a = A() ## point a.arr to the same thing A.arr points to ## A.arr -> (empty list object) ## a.arr -> (empty list object) >>>a.arr.append("haha") ## insert ("haha" string object) into (empty list >>>object) both a.i and A.i point to ## A.i -> (list object) -> ("haha" string object) ## a.i -> (list object) -> ("haha" string object) >>>a.arr = ["xixi"] ## point a.arr to a new (list object) pointing to a new >>>("xixi" string object) ## A.i -> (list object) -> ("haha" string object) ## a.i -> (different list object) -> ("xixi" string object) >>>A.arr.append("xx") ## insert ("xx" string object) into (list object) A.i >>>points to ## A.i -> (list object) -> ("haha" string object),("xx" string object) ## a.i -> (different list object) -> ("xixi" string object) etc. ... ------------------------------------- >>>class X: def __init__(self): self.arr = [] ## instances of Class X have a named pointer arr pointing to a new (empty list object) ## X.arr does not exist! >>>m = X() ## creates a new (empty list object) and has m.arr >>>point to it ## m.arr -> (empty list object) >>>n = X() ## creates a new (empty list object) and has n.arr >>>point to it ## m.arr -> (empty list object) ## n.arr -> (different empty list object) >>>m.arr.append("haha") ## insert ("haha" string object) into (list object) m.i >>>points to ## m.i -> (list object) -> ("haha" string object) ## n.i -> (different empty list object) -- http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list