Something in the function tutorial confused me.
Steve Holden
steve at holdenweb.com
Mon Aug 6 14:26:59 EDT 2007
Lee Fleming wrote:
> On Aug 6, 6:25 am, Neil Cerutti <horp... at yahoo.com> wrote:
> 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.
>
> Thanks for the prompt replies. But I am still confused. This is what
> confuses me....
> The first time you call the function, say with f(23), after the
> function ends,
> y no longer equals None. Therefore, calling f again, this time like
> this f(24),
> should make y equal [23,24], because the 'if y == None' test fails, or
> at least I think it
> fails, because y.append(x) added something that was not equal to None
> during the previous call.
>
> Please help me!
>
The thing that doesn't seem to have been stated explicitly is that each
function call creates a brand-new namespace. This namespace is
initialized from the function definition, which includes assignment of
default values to absent keyword arguments. The function definition,
then, contains a reference to each default argument value.
In the case that tripped you up, however, the default argument you
provided was a mutable object (a list) that can be changed in place by
operations like .append(), whereas when you provide a None default any
further assignment to the argument name binds it to a new value. In the
first case, changes to the object are naturally reflected in later
calls, since it is the object referenced in the function definition that
is being mutated.
It's only really the same difference as
a = [1, 2]
b = a
a.append("three")
which modifies a single list to which both names, a and b, are bound, and
a = 5
b = a
a += 3
which rebinds the name a to a new object, meaning that a and b are no
longer bound to the same object.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------
More information about the Python-list
mailing list