Gabriel Genellina wrote: > En Tue, 24 Apr 2007 22:31:59 -0300, Calvin Spealman <[EMAIL PROTECTED]> > escribió: > >> In the internal API when a C function is called and passed a kwarg >> dictionary, is there any case where anything else has a reference to >> it? I checked with the following code and it looks like even if you >> explicitly pass a dictionary with **kwargs, it still copies the >> dictionary anyway. > > See the Python Reference Manual, 5.3.4 Calls > http://docs.python.org/ref/calls.html > > Unfortunately it does not explicitely *guarantee* it will be a new > dictionary. At least the way I read the docs, on a function call like this: > > def foo(**kwargs): pass > d = {'a':1, 'b':2) > foo(**d) > > Python could bind the existing d object to the formal parameter kwargs and > still comply with the documented behavior. Some of my own code would break > if that happened... :( > The point is, of course, that inside the function you don't know whether extra keyword arguments were provided as a part of a call with a **kwargs argument or individually provided as kw1=value1. In the latter case, obviously, there is no dict to choose whether to copy or not, so the interpreter has no choice but to create a new dictionary.
On the one hand it would seem sensible to extend the definition of the semantics so it is clear beyond doubt that mutating a **kwargs parameter dictionary inside a function body does not change any dictionary that was provided as a **argument, /even in the case where there is a one-to-one correspondence between them/. On the other hand it would also seem sensible to realise that this latter case is so unusual that providing explicit semantics to support it would take much more implementation work than always making a copy of any **kw argument. On the third hand, even *I* seem sensible sometimes so you just never can tell :-) 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 Recent Ramblings http://holdenweb.blogspot.com -- http://mail.python.org/mailman/listinfo/python-list