Why is this?

phil hunt zen19725 at zen.co.uk
Wed Aug 10 10:57:07 EDT 2005


On Wed, 10 Aug 2005 12:40:54 +0200, Jiri Barton <jbar at hosting4u.cz> wrote:
>Hi everyone,
>
>I have a problem with initialization.
>>>> a, b = [[]]*2
>>>> a.append(1)
>>>> b
>[1]
>
>Why is this? Why does not this behave like the below:
>
>>>> a, b = [[], []]
>>>> a.append(1)
>>>> b
>[]

In your 1st example a and b point to copies of the same object, in 
the second example the point to two separate objects that happen to 
have the same repr() representation.

Here's another example of the same thing:

>>> c = []
>>> d = [c,c]
>>> e = [[],[]]
>>> d
[[], []]
>>> e
[[], []]

(d) and (e) appear to be the same (i.e. they have the same repr() 
form), but they are not. Consider:

>>> e[1].append("spam")
>>> e
[[], ['spam']]

But:

>>> d[1].append("spam")
>>> d
[['spam'], ['spam']]

The point is that in Python an object's repr() -- which stands for 
"representation" -- doesn't actually tell you how the object is 
represented inside the innards to the Python system.

Incidently I am currently working on a programming language that 
fixes this problem. In my language "Unify", the equivalent of repr 
is called "storage manager format" (or SM-format) because if two 
values have the same SM-format it is guaranteed that the system will 
treat them identiacally. The SM-format can thus be used for 
serialisation, and incidently it is also the same format in which 
literals are written in a program.

In Unify to specify an Array containing two separate empty Arrays 
would look like this:

e := #(() ())

The code to add a value to one sub-array, and print the result is:

e[1] @= 'spam'.  // means same as Python d[1].append("spam")
out << sm(e).    // convert to SM-string, output it to stdout

This would print this text:

#(() (spam))

An array containing two copies of the same sub-array might look like 
this:

d := #( () &[0] )

Where "&[0]" means "pointer to the 0th array subscript".


-- 
Email: zen19725 at zen dot co dot uk





More information about the Python-list mailing list