evaluated function defaults: stored where?

D

David Isaac

Default parameter values are evaluated once when the function definition is
executed.
Where are they stored? (A guess: in a dictionary local to the function.)
Where is this documented?

As a Python newbie I found this behavior quite surprising.
Is it common in many other languages?
Is it unsurprising if I look at it right?

Thanks,
Alan Isaac
 
A

alex23

David said:
As a Python newbie I found this behavior quite surprising.

It can be even more surprising if a default value is mutable:
.... b.append(a)
.... return b
[1, 2, 3]
['a', 'b', 'c']
[1]

So far, everything is behaving much as you'd expect, but then:
[1, 2]
[1, 2, 3]

The parameter is bound to the list at creation time and, being mutable,
is modifiable each time the function is called.

This can be avoided by modifying your function slightly:
[1, 2, 3]
['a', 'b', 'c']
[3]

-alex23
 
A

alex23

I wrote: (some guff on default parameters)

Of course, it helps if I actually include the alternative function's
code:
.... if b == None: b = []
.... b.append(a)
.... return b

Sorry about that :)

-alex23
 
J

John Machin

David said:
Default parameter values are evaluated once when the function definition is
executed.
Where are they stored?

A good bet for where to start looking for the storage would be as an
attribute of the function object. From this point, there are two paths:

(a) Make a function and inspect it:
.... pass
....['__call__', '__class__', '__delattr__', '__dict__', '__doc__',
'__get__', '__getattribute__', '__hash__', '__init__', '__module__',
'__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', 'func_closure', 'func_code', 'func_defa
ults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

(b) Become familiar with the general structure of the manuals.
By process of elimination, the Python Reference Manual would be a good
place to start for a question of this type.
Inside that manual, this is a likely candidate:
"""
3.2 The standard type hierarchy
Below is a list of the types that are built into Python.
"""

I'll leave you to read further ...
(A guess: in a dictionary local to the function.)

As you've seen the default values are contained in a tuple. So where are
the keys of the mapping {'b': 42, 'c': 666} that you expected? Suppose
*you* do the extra research and report back ...
Where is this documented?

See above.
As a Python newbie I found this behavior quite surprising.

Surprisingly good, bad or just different? Do you have alternate
non-surprising behaviours in mind?
Is it common in many other languages?

That makes two of us who don't know and haven't done any research :)
My impression based on a limited number of different languages that I've
worked with or looked at is that Python's apparatus is the best I've
seen; YMMV.
Is it unsurprising if I look at it right?

Yes; in general this is true across many domains for a very large number
of referents of "it" :)

Cheers,
John
 
R

Raymond Hettinger

Is it unsurprising if I look at it right?

[John Machin's QOTW]
Yes; in general this is true across many domains for a very large number
of referents of "it" :)

There's a Quote of the Week in there somewhere.
 
D

David Isaac

Alan said:
Default parameter values are evaluated once when the function definition is
executed. Where are they stored? ... Where is this documented?

Forgive any poor phrasing: I'm not a computer science type.
At http://www.network-theory.co.uk/docs/pytut/tut_26.html we read:
"The execution of a function introduces a new symbol table
used for the local variables of the function. More precisely,
all variable assignments in a function store the value in the local
symbol table; whereas variable references first look in the local
symbol table, then in the global symbol table, and then in the table of
built-in names."

But the default values of function parameters seem rather like a static
attributes of a class.
Is that a good way to think of them?
If so, are they somehow accessible?
How? Under what name?

Thanks,
Alan Isaac
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,052
Latest member
LucyCarper

Latest Threads

Top