Semantics of the empty list

Larry Bates lbates at swamisoft.com
Thu Jul 15 13:54:06 EDT 2004


Dave,

I agree that it is HIGHLY unlikely that if a
programmer types:

b=[[]]*5

what they wanted is to create a list with 5 instances
of the same empty list, but I don't have a suggestion
for an "alternative" grammar.  It's almost like this
"shortcut" shouldn't work at all because it will almost
always create something you didn't want.  Then you would
HAVE to use loop/append or list comprehension method
that work as expected.

Larry Bates
Syscon, Inc.

"Dave Opstad" <dave.opstad at agfamonotype.com> wrote in message
news:dave.opstad-6CEE5B.10122115072004 at reader0903.news.uu.net...
> I fully understand why this happens:
>
> ----------------------------
> >>> a = [[], [], [], [], []]
> >>> b = [[]] * 5
> >>> a
> [[], [], [], [], []]
> >>> b
> [[], [], [], [], []]
> >>> a == b
> True
> >>> id(a[0]) == id(a[1])
> False
> >>> id(b[0]) == id(b[1])
> True
> >>> a[1].append(42)
> >>> a
> [[], [42], [], [], []]
> >>> b[1].append(42)
> >>> b
> [[42], [42], [42], [42], [42]]
> ----------------------------
>
> What is curious to me is the implication that there are multiple,
> distinct empty list objects (whose ids are not equal). Is this the case
> for all mutable objects?
>
> I wonder if it would be useful to have some symbol whose semantics are
> "distinct mutable." For the sake of discussion, let's say the symbol \\
> means the same as [] (i.e. it's the empty list), but with this "distinct
> mutable" semantic. Then I could safely do something like:
>
> >>> b = [\\] * 5
> >>> b
> [[], [], [], [], []]
> >>> id(b[0]) == id(b[1])
> False
>
> to safely initialize b as a list of distinct empty lists. As it is now,
> I have to do something like this:
>
> >>> b = [[] for x in range(5)]
>
> in order to get the semantic I want. It's not any great hardship, of
> course, but I have been bitten by the [[]] * 5 case and its cousins on
> several occasions, and it might be nice if there were a separate
> semantic as described above to make it more clear what's going on.
>
> Just some random thoughts...
>
> Dave





More information about the Python-list mailing list