Something in the function tutorial confused me.

Lee Fleming countblabula at yahoo.com
Mon Aug 6 15:04:55 EDT 2007


On Aug 6, 1:26 pm, Steve Holden <st... at holdenweb.com> wrote:
> 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 -------------- Hide quoted text -
>
> - Show quoted text -

Thanks! I'm glad you all took the time out to help me. :)




More information about the Python-list mailing list