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

Reply via email to