functions, list, default parameters

Chris Rebert clp2 at rebertia.com
Thu Oct 21 23:51:02 CEST 2010


On Thu, Oct 21, 2010 at 2:36 PM, Sean Choi <gnemnk at gmail.com> wrote:
> I found two similar questions in the mailing list, but I didn't understand
> the explanations.
> I ran this code on Ubuntu 10.04 with Python 2.6.5.
> Why do the functions g and gggg behave differently? If calls gggg(3) and
> g(3) both exit their functions in the same state, why do they not enter in
> the same state when I call gggg(4) and g(4)?
>
> # ---------------------------------------------------------------------- my
> code:
> def gggg(a, L=[]):

This is a common newbie stumbling-block: Don't use lists (or anything
mutable) as default argument values (in this case, for L); a new list
is *not* created for every function invocation, they'll all share the
*exact same list object*. Use None and then create a fresh list (or
what have you) in the function body. See
http://effbot.org/pyfaq/why-are-default-values-shared-between-objects.htm

>     print "enter function"
>     print "a = ", a, "and L = ", L
>     if L == []:
>         print "hey, L is empty"
>         L = []

The previous line is why the two functions' behaviors differ (g()
lacks this line). Read the above FAQ, and then carefully trace through
the execution of the functions; the difference will then be clear.

Cheers,
Chris
--
http://blog.rebertia.com

>     L.append(a)
>     print "after append, L = ", L
>     return L

> def g(a, L=[]):
>     print "enter function"
>     print "a = ", a, "and L = ", L
>     if L == []:
>         print "hey, L is empty"
>     L.append(a)
>     print "after append, L = ", L
>     return L



More information about the Python-list mailing list