On 11/06/2012 06:35 AM, Oscar Benjamin wrote:

> In general, people don't use element multiplication (that I have *ever* seen) to make lists where all elements of the outer most list point to the same sub-*list* by reference. The most common use of the multiplication is to fill an array with a constant, or short list of constants; Hence, almost everyone has to work around the issue as the initial poster did by using a much longer construction.

That's what I have seen as well. I've never seen an example where someone wanted this behaviour.

>
> The most compact notation in programming really ought to reflect the most *commonly* desired operation. Otherwise, we're really just making people do extra typing for no reason.

It's not so much the typing as the fact that this a common gotcha. Apparently many people expect different behaviour here. I seem to remember finding this surprising at first.

:)  That's true as well.

>
> Further, list comprehensions take quite a bit longer to run than low level copies; by a factor of roughly 10. SO, it really would be worth implementing the underlying logic -- even if it wasn't super easy.
>
> I really don't think doing a shallow copy of lists would break anyone's program. > The non-list elements, whatever they are, can be left as reference copies -- but any element which is a list ought to be shallow copied. The behavior observed in the opening post where modifying one element of a sub-list, modifies all elements of all sub-lists is never desired as far as I have ever witnessed.

It is a semantic change that would, I imagine, break many things in subtle ways.

?? Do you have any guesses, how ?

>
> The underlying implementation of Python can check an object type trivially, and the only routine needed is a shallow list copy. So, no it really isn't a complicated operation to do shallow copies of lists.

Yes but if you're inspecting the object to find out whether to copy it what do you test for? If you check for a list type what about subclasses? What if someone else has a custom list type that is not a subclass? Should there be a dunder method for this?

No dunder methods.  :)
Custom non-subclass list types aren't a common usage for list multiplication in any event. At present one has to do list comprehensions for that, and that would simply remain so.

Subclasses, however, are something I hadn't considered...

I don't think it's such a simple problem.

Oscar

You made a good point, Oscar; I'll have to think about the subclassing a bit.
:)


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to