On 2007-08-06, Lee Fleming <[EMAIL PROTECTED]> wrote: > I have a simple question. Say you have the following function: > > def f(x, y = []): > y.append(x) > return y > > print f(23) # prints [23] > print f(42) # prints [23, 42] > > def f(x, y=None): > if y is None: y = [] > y.append(x) > return y > > print f(23) # prints [23] > print f(42) # prints [42]
Default argument expressions are evaluated only once, specifically, at the time the function definition is executed. Statements inside the function are executed every time the function is called. > Why didn't the second call to f, f(42) return [23, 42]? Because when the function is called, the line > if y is None: y = [] is executed, binding a brand new empty list to y. This "rebinding" happens every time the function is called, unless you provide an argument for y that is not None. For example, with the second definition... >>> f(f(23)) [23, 42] See: http://www.ferg.org/projects/python_gotchas.html#contents_item_6 This has been called a gotcha for a good reason. The sequence of events for the binding of default arguments isn't obvious, and for expressions that result in mutable objects, it's not intuitive. -- Neil Cerutti The outreach committee has enlisted 25 visitors to make calls on people who are not afflicted with any church. --Church Bulletin Blooper -- http://mail.python.org/mailman/listinfo/python-list