<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 10, 2015 at 1:31 AM, Donald Stufft <span dir="ltr"><<a href="mailto:donald@stufft.io" target="_blank">donald@stufft.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><br>
> On Feb 10, 2015, at 12:55 AM, Greg Ewing <<a href="mailto:greg.ewing@canterbury.ac.nz" target="_blank">greg.ewing@canterbury.ac.nz</a>> wrote:<br>
><br>
> Donald Stufft wrote:<br>
>> However [*item for item in ranges] is mapped more to something like this:<br>
>> result = []<br>
>> for item in iterable:<br>
>>    result.extend(*item)<br>
><br>
> Actually it would be<br>
><br>
>   result.extend(item)<br>
><br>
> But if that bothers you, you could consider the expansion<br>
> to be<br>
><br>
> result = []<br>
> for item in iterable:<br>
>   for item1 in item:<br>
>      result.append(item)<br>
><br>
> In other words, the * is shorthand for an extra level<br>
> of looping.<br>
><br>
>> and it acts differently than if you just did *item outside of a list comprehension.<br>
><br>
> Not sure what you mean by that. It seems closely<br>
> analogous to the use of * in a function call to<br>
> me.<br>
><br>
<br>
</span>Putting aside the proposed syntax the current two statements are currently<br>
true:<br>
<br>
1. The statement *item is roughly the same thing as (item[0], item[1], item[n])<br>
2. The statement [something for thing in iterable] is roughly the same as:<br>
   result = []<br>
   for thing in iterable:<br>
       result.append(something)<br>
   This is a single loop where an expression is ran for each iteration of the<br>
   loop, and the return result of that expression is appended to the result.<br>
<br>
If you combine these two things, the "something" in #2 becuase *item, and since<br>
*item is roughly the same thing as (item[0], item[1], item[n]) what you end<br>
up with is something that *should* behave like:<br>
<br>
result = []<br>
for thing in iterable:<br>
    result.append((thing[0], thing[1], thing[n]))<br></blockquote><div><br></div><div>That is what [list(something) for thing in iterable] does.</div><div><br></div><div>The iterable unpacking rule might have been better explained as follows:</div><div><br></div><div>————</div><div>On the left of assignment * is packing, e.g.</div><div>a, b, *cs = iterable</div><div><br></div><div>On the right of an assignment, * is an unpacking, e.g.</div><div><br></div><div>xs = a, b, *cs</div><div>————<br></div><div><br></div><div>In either case, the  elements of "cs" are treated the same as a and b.<br></div><div><br></div><div>Do you agree that [*x for x in [as, bs, cs]] === [*as, *bs, *cs] ?</div><div><br></div><div>Then the elements of *as are unpacked into the list, the same way that those elements are currently unpacked in a regular function call</div><div><br></div><div>f(*as) === f(as[0], as[1], ...)</div><div><br></div><div>Similarly,</div><div><br></div><div>[*as, *bs, *cs] === [as[0], as[1], …, bs[0], bs[1], …, cs[0], cs[1], …]</div><div><br></div><div>The rule for function calls is analogous:</div><div><br></div><div>————<br></div><div>In a function definition, * is a packing, collecting extra positional argument in a list.  E.g., </div><div><br></div><div>def f(*args):</div><div><br></div><div>In a function call, * is an unpacking, expanding an iterable to populate positional arguments.  E.g.,</div><div><br></div><div>f(*args)</div><div><br></div><div>—</div><div><br></div><div>PEP 448 proposes having arbitrary numbers of unpackings in arbitrary positions.</div><div><br></div><div>I will be updating the PEP this week if I can find the time.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<br>
Or to put it another way:<br>
<br>
>>> [*item for item in [[1, 2, 3], [4, 5, 6]]<br>
[(1, 2, 3), (4, 5, 6)]<br>
<br>
<br>
Is a lot more consistent with what *thing and list comprehensions already mean<br>
in Python than for the answer to be [1, 2, 3, 4, 5, 6].<br>
<span>---<br>
Donald Stufft<br>
PGP: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA<br>
<br>
</span><div><div>_______________________________________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/mistersheik%40gmail.com" target="_blank">https://mail.python.org/mailman/options/python-dev/mistersheik%40gmail.com</a><br>
</div></div></blockquote></div><br></div></div>