On 07Apr2015 21:16, boB Stepp <[email protected]> wrote:
Despite Mark's warning, I feel I must see if I understand what is going on here.

Switching to Py 3.4 since I am now at home:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600
64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
d = {'a': '123'}
def func(s=d['a']):
             print(s)
             print(d['a'])

func()
123
123
d['a'] = 'new value'
func()
123
new value

I added an additional print to the function to show the dictionary
entry's behavior.

First, my current understanding is that this form of the function does
not object to the presence of d['a'] in its parameter list because s
is the real parameter, d['a'] is its default value, but s is not
actually evaluated until run time.

Yes and no.

Yes to "s is the real parameter, d['a'] is its default value".

No to "s is not actually evaluated until run time".

When you _define_ the function, the _current_ value of d['a'] is stashed in the function definition as the default value.

When you _call_ the function, and omit the 's' parameter, the default value is used.

However, that value was _computed_ when the function was compiled: the function definition does not keep "d['a']" around for evaluation, instead that expression is evaluated when you define the function, and the reference to the resulting value kept around. That is thus '123'.

So when you go:

 d['a'] = 'new value'

the contents of the "d" dictionary have changed. But all that has happened is that the reference to '123' is no longer in the dictionary; instead a reference to 'new value' is in the dictionary.

When you call "func()" the name "s" is bound to the default value, which is the '123' as computed at function definition time. And it prints that. Of course, when you print "d['a']" it must evaluate that then, and finds 'new value'.

This is one reason why the common idion for default values looks like this:

 def func(s=None):
   if s is None:
     s = ... compute default here ...

Of course, the default is often a constant or some value computed earlier.

Cheers,
Cameron Simpson <[email protected]>

I think... Therefore I ride.  I ride... Therefore I am.
       - Mark Pope <[email protected]>
_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to