<div dir="ltr"><br><br><div class="gmail_quote">On Tue, Aug 26, 2008 at 9:10 PM, Bruce Leban <span dir="ltr">&lt;<a href="mailto:bruce@leapyear.org">bruce@leapyear.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr">There are two issues** here:<br><br>(1) def foo(L=[]):<br>the [] is a single list, not a new list created every time the function is called.<br><br>(2) def foo(L=list()):<br>the list() is evaluated once when the function is declared.<br>

<br>I think (1) is easy to explain; I find (2) confusing. (**Yes, I realize that these can be considered the same issue, but I&#39;m speaking here as a person writing python programs, not designing the language.) On the other hand, consider this code:<br>

<br>&nbsp;&nbsp;&nbsp; bar = 1<br>&nbsp;&nbsp;&nbsp; def foo(arg=bar):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(arg)<br>&nbsp;&nbsp;&nbsp; bar = 2<br>&nbsp;&nbsp;&nbsp; foo()<br><br>I would be very surprised if foo() printed 2 rather than 1. The difference to my (programmer&#39;s) mind is that in this case bar looks like a simple value and list() looks like a function call. So it&#39;s not quite that simple. At least the way it works now is completely consistent and the code:<br>

<br>&nbsp;&nbsp;&nbsp; def foo(arg=None):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg = bar if arg is None else arg<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg2 = list() if arg is None else arg<br><br>is unambiguous if clumsy.<br><br>Now thinking as a language designer, C# has a ?? operator where A??B is shorthand for (B if A is None else A) except you only have to write A once and A is only evaluated once. A Pythonesque version of this would be just &quot;else&quot;:<br>

<br>&nbsp;&nbsp; def foo(arg=None, arg2=None):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg = arg else bar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg2 = arg2 else list()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>And I think that metaphor is easy to read. Chains of else operators can be useful:<br><br>&nbsp;&nbsp; x = f() else g() else h() else 0</div>
</blockquote><div><br>Not a bad idea.&nbsp; Looks like the time machine is at work again:<br><br>x = f() or g() or h() or 0<br><br>:-)<br><br>- C<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr"><br>
<br>--- Bruce<br></div>
<br>_______________________________________________<br>
Python-3000 mailing list<br>
<a href="mailto:Python-3000@python.org">Python-3000@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-3000" target="_blank">http://mail.python.org/mailman/listinfo/python-3000</a><br>
Unsubscribe: <a href="http://mail.python.org/mailman/options/python-3000/shiblon%40gmail.com" target="_blank">http://mail.python.org/mailman/options/python-3000/shiblon%40gmail.com</a><br>
<br></blockquote></div><br></div>