On 01/-10/-28163 02:59 PM, Válas Péter wrote:
Hi,
let X be a mutable container, such as dict/set/list=bytearray, and Y=X,
When I change X, Y will follow it, having always the same value, although
id(X)!=id(Y). How is that, what is the explanation? Meanwhile the same for
immutable types results a real copy, and so does for simple mutables such as
int.
I suspect it has something to do with pointers, but what is the difference
between mutables and immutables, and why have they different id's if they
are the same?
It would help greatly if you actually posted some code that showed your
confusion, since there are several errors in your message. As Wayne
pointed out, integers are immutable. There are no methods on them that
modify them in place. All you can do is bind a variable to a different
integer object.
Further, if you set Y=X, the id's will be the same. Try it, and paste
the actual test into your message. Don't just paraphrase.
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = [4, 5,6]
>>> y = x
>>> id(y)
24789144
>>> id(x)
24789144
Now, if you change x by doing an append, for example, they both change:
You mutated the object to which they both refer.
>>> x.append(42)
>>> x
[4, 5, 6, 42]
>>> y
[4, 5, 6, 42]
>>>
But if you rebind one of them, then they can diverge:
>>> x = [3]
>>> x
[3]
>>> y
[4, 5, 6, 42]
>>> id(x)
24978568
>>> id(y)
24789144
Now you can notice that x has a different id. It's bound to a different
object.
Now, if an object is immutable, then the question of what happens when
you change the object is nonsensical. Since you can't change it, you
don't really care if the two names are bound to same object, or just to
two objects that happen to have the same value.
One more thing. Binding happens in an assignment, but it also happens
in a function call, and in some import syntaxes and in for loops,
generator expressions, and list comprehensions. Some of that behavior
can change between different versions of Python, so if you start getting
into those corners, you'll have to be more specific.
HTH
DaveA
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor