[Tutor] Tuples, Dictionarys and mutable vs. immutable

Danny Yoo dyoo@hkn.eecs.berkeley.edu
Mon, 26 Feb 2001 01:39:21 -0800 (PST)


On Sun, 25 Feb 2001, Sheila King wrote:

> OK, it gets better and better. Now explain this:
> 
> >>> mytuple
> 'b'
> >>> mylist =['a', 'b', 'c']


Ok, we have this picture so far:

mytuple -----> 'b'
mylist  -----> ['a', 'b', 'c']


> >>> type (mylist)
> <type 'list'>
> >>> id(mylist)
> 11519964

Wait, let me remind myself what id does:

###
>>> print id.__doc__
id(object) -> integer

Return the identity of an object.  This is guaranteed to be unique among
simultaneously existing objects.  (Hint: it's the object's memory
address.)
###

Ah, ok, so that means that our picture is too simplified; there's actually
a memory position involved here:


mytuple -----> 'b' (don't know yet)
mylist  -----> ['a', 'b', 'c'] (at position 11519964)


> >>> id (mytuple)
> 8532608


Ok, so our picture is now:

mytuple -----> 'b' (at position 8532608)
mylist  -----> ['a', 'b', 'c'] (at position 11519964)


> >>> mylist = mytuple


Now its:

mytuple -----> 'b' (at position 8532608)
mylist  --------^


You might be wondering where the value ['a', 'b', 'c'] just went to.  
Because we've just cut off the only reference to that value, it just
"floats away".  Nice idylic picture.  Too bad we have to call it GARBAGE
COLLECTION.  *grin*



> >>> type (mylist)
> <type 'string'>
> >>> id (mylist)
> 8532608

And the picture above reflects why it gives us these results.  The thing
that might be confusing is that there's a separation between the "name"
(reference) of a thing and its "value".  Python will let us put hundreds
of names, all directed to the same value.

###
>>> a = ['some value in a mutable list']
>>> b = a
>>> c = b
>>> a, b, c
(['some value in a mutable list'], ['some value in a mutable list'],
['some value in a mutable list'])
###

and by changing that mutable value, we'll see its effect across the board:

###
>>> a[0] = 'changed!'
>>> a, b, c
(['changed!'], ['changed!'], ['changed!'])
###



Side note: one thing you might have noticed is that when we take the id()
of numbers:

###
>>> x = 5
>>> y = 5
>>> id(x), id(y)
(135823832, 135823832)
###

it appears that we're getting the same value.  No shock yet; why shouldn't
it?  But here's something weird:

###
>>> u = 3000
>>> v = 3000
>>> id(u)
135942320
>>> id(v)
135942368      ## They're different!
###

Try to think of a reason why this happens.  Hint: there's a point in which
this strangeness triggers, and it's somewhere between 5 and 3000.  *grin*