default value in __init__

David C. Ullrich dullrich at sprynet.com
Tue Oct 14 14:36:44 EDT 2008


In article <48ef37fe$0$22798$426a34cc at news.free.fr>,
 Bruno Desthuilliers <bruno.42.desthuilliers at websiteburo.invalid> 
 wrote:

> David C. Ullrich a écrit :
> > In article 
> > <5f3a6fdc-40e5-4450-b65d-066f87f27309 at v53g2000hsa.googlegroups.com>,
> >  kenneth <kenneth at inwind.it> wrote:
> > 
> >> On Oct 9, 10:14 am, Christian Heimes <li... at cheimes.de> wrote:
> >>> kenneth wrote:
> >>>> the 'd' variable already contains the 'self.d' value of the first
> >>>> instance and not the default argument {}.
> >>>> Am I doing some stupid error, or this is a problem ?
> >>> No, it always contains the default argument because default values are
> >>> created just ONE 
> >>> TIME.http://effbot.org/pyfaq/why-are-default-values-shared-between-objects
> >>> ..
> >>> .
> >>
> >> Wow, it's a very "dangerous" behavior ...
> >>
> >> Just to know, is this written somewhere in the python documentation or
> >> one has to discover it when his programs fails to work ;-) ?
> > 
> > At least once a week someone discovers this "problem", makes a
> > post about it here, and then someone points to the spot in the
> > documentation where it's explained.
> > 
> > Seems to me that people often site the "important warning" in
> > the tutorial. Of course there's no reason anyone would bother
> > going through the tutorial
> 
> Indeed. No reason at all.
> 
> > - just for fun I looked in the
> > official Python Reference Manual to see whether they're explicit
> > about this or require the reader to figure it out from something
> > else they say.
> > 
> > There's a section titled "7.6 Function definitions". About halfway
> > through that section there's a _bold face_ statement 
> > "Default parameter values are evaluated when the function definition is 
> > executed.", followed by an explanation of how that can lead to
> > the sort of problem above.
> 
> But there's no reason to read the reference manual neither.
> 
> > So I guess it _is_ awfully dangerous. They should really explain
> > this aspect of the language's behavior to people who don't read
> > the formal definition and also don't work through the tutorial.
> 
> You mean : "to people that don't bother reading the FineManual *nor* 
> searching the newsgroup / ML archives ?"

Yes. Also add "don't read any books". I think I started with some
book - the book pointed out the "surprise" you get when you say

L = [[0]] * 10
L[0][0] = 1

or something similar. I was probably surprised once by the
mutable default parameter thing once but having understood
that other example it wasn't hard to see what was happening.

> Well... How to say.. Is there any chance these people will read anything 
> *at all* ?

No. That's exactly the point! Basic Python is so transparent that
you can start using it without reading anything, just looking at
a few examples. _Because_ of that it's their responsibility to
ensure that if you look at a few examples you then have a complete
understanding of the language.

In particular default parameters should work the way the user
expects! The fact that different users will expect different
things here is no excuse...

-- 
David C. Ullrich



More information about the Python-list mailing list