[Tutor] Variable Modification in a class
Danny Yoo
dyoo@hkn.eecs.berkeley.edu
Tue Jun 3 15:06:17 2003
On Tue, 3 Jun 2003, Mehta, Anish wrote:
> I m sorry that i am repeating my last mail. Here also in c i m doing the
> same thing. Or is there any differnce? The point is clear to me that
> when i do ' c = b' it makes the memory locations same.
>
> C example which is creating the confusion:
>
> typedef struct ab
> {
> int a;
> int b;
> }AB;
>
> main()
> {
> AB b;
> AB c;
>
> b.a = 5;
> b.b = 10;
>
> c = b;
>
> c.a = 30;
> c.b = 40;
>
> printf("AB values %d %d\n", b.a, b.b);
> printf("New values %d %d\n", c.a, c.b);
> }
Let me see if I can translate the situation in C code.
/******/
AB* b = malloc(sizeof(AB));
AB* c = malloc(sizeof(AB));
b->a = 5;
b->b = 10;
c = b; /** This is the crucial line. */
/******/
The equivalent Python code is:
###
b = AB()
c = AB
b.a = 5
b.b = 10
c = b ## This is the crucial line.
###
Does this make sense? Names in Python are things that point to objects.
Since you're a C programmer, I think you'll understand this: in Python,
everything's a pointer. That is, all object access in Python goes through
a level of indirection.
The confusion that you're running into is related to the way C allows for
two different ways of working with structures: direct access, like
/***/
AB some_object;
/***/
vs indirect access through a pointer:
/***/
AB* some_object = malloc(sizeof(AB));
/***/
If you keep in your head that Python always uses the indirect method, the
problem you're running into should be immediately clear.
What you want to do, instead of reassigning c to b, is to make a copy of
b, and assign that copy to c. We can do this with the copy module:
http://www.python.org/doc/lib/module-copy.html