<div dir="ltr"><div>-1 as well.</div><div><br></div><div>I have used the generator multiplication many times before. The use of the same object helps a lot in certain cases.</div><div>Changing that will cause a confusion among those who know the phenomenon and would break compatibility.</div><div><br></div><div>Regarding your matrix example, maybe we can make use of the new '@' operator for copying new objects, what do you say?</div><div><br></div><div>-- Bar Harel</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, May 31, 2016 at 8:01 PM Terry Reedy <<a href="mailto:tjreedy@udel.edu">tjreedy@udel.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 5/31/2016 10:16 AM, Steven D'Aprano wrote:<br>
> On Tue, May 31, 2016 at 01:36:31PM +0000, Joseph Martinot-Lagarde wrote:<br>
>>> I can only agree here. Even today, despite knowing the fact, it's<br>
>>> causing some headaches in some cases.<br>
>><br>
>> How about raising an exception if mutable objects are in the list ?<br>
><br>
> -1<br>
><br>
> It's a gratuitous breakage that cannot solve the problem, because you<br>
> cannot tell in advance which objects are mutable and which are not. The<br>
> best you can do is recognise known built-ins.<br>
><br>
> ("list is mutable, tuple is not, except when it contains a mutable<br>
> item, but mymodule.MySequence may or may not be, there's no way to<br>
> tell in advance.")<br>
><br>
><br>
>> - maybe there are useful use cases of duplicating the reference ?<br>
><br>
> Absolutely. That's a standard way of grouping items taken from an<br>
> iterable:<br>
><br>
> py> it = iter("hello world!")<br>
> py> for a, b, c in zip(*[it]*3):  # groups of three<br>
> ...     print(a, b, c)<br>
> ...<br>
> h e l<br>
> l o<br>
> w o r<br>
> l d !<br>
><br>
><br>
> This wouldn't work if the iterators were three independent copies.<br>
<br>
-1 also.  As Steven has pointed out several times in other threads,<br>
Python is consistent in not copying objects unless requested.  Thus<br>
<br>
a = [1,2,3]<br>
b = a  # a reference copy, not an object copy, as some expect<br>
a[1] = 4<br>
print(b[1])<br>
# 4 -- a surprise for those who expect '=' to copy the list object<br>
<br>
Sequence * is an elaboration of the same issue.<br>
<br>
--<br>
Terry Jan Reedy<br>
<br>
<br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div>