List Problem

Chris Angelico rosuav at gmail.com
Sun Sep 23 18:27:28 EDT 2012


On Mon, Sep 24, 2012 at 8:03 AM, Dave Angel <d at davea.name> wrote:
> blist = [alist, alist, alist]   #  or blist = alist * 3

(Minor point: I think you mean this.)
#  or blist = [alist] * 3

> Understand, this is NOT a flaw in the language.  It's perfectly
> reasonable to be able to do so, in fact essential in many cases, when
> you want it to be the SAME item.

And this is the real part. There's no other way to handle complex
objects that makes as much sense. PHP's system of references and
copy-on-write assignment doesn't truly cover all cases, and it can
make operations unexpectedly run vastly faster or slower depending on
external circumstances, which gets annoying (the first write to an
assigned array has to copy the array). C simply doesn't let you move
arrays around, only pointers to them, so semantics are actually pretty
similar to high level languages, only in a completely different way.

These sorts of issues only ever seem to crop up with nested arrays,
which strengthens this next point: Deep copying is a really REALLY
hairy concept. It seems so simple at first:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = deepcopy(a) # b is a new list with three new sublists

But then it gets messy.

a = [[1, 2, 3]]*2 + [[7, 8, 9]]

It's much better to make copying a very explicit thing; it's so
expensive that you really should make it very clear in your code when
this happens.

ChrisA



More information about the Python-list mailing list