storing references instead of copies in a dictionary

Uwe Schmitt rocksportrocker at googlemail.com
Thu Jul 17 08:04:52 EDT 2008


On 17 Jul., 13:45, mk <mrk... at gmail.com> wrote:
> Hello everyone,
>
> I'm storing functions in a dictionary (this is basically for cooking up
> my own fancy schmancy callback scheme, mainly for learning purpose):
>
>  >>> def f2(arg):
> ...     return "f2 " + arg
> ...
>  >>>
>  >>> def f1(arg):
> ...     return "f1" + arg
> ...
>
>  >>> a={'1': f1, '2': f2}
>  >>>
>  >>> [ x[1](x[0]) for x in a.items() ]
> ['f11', 'f2 2']
>
> Well, neat. Except if I change function definitions now, old functions
> are called. And rightly:
>
> {'1': <function f1 at 0xb7f0ba04>, '2': <function f2 at 0xb7f0b9cc>}
>  >>> f1
> <function f1 at 0xb7f0ba04>
>  >>>
>  >>> def f1(arg):
> ...     return "NEW f1 " + arg
> ...
>  >>> f1
> <function f1 at 0xb7f0b994>
>
> The address of function f1 has obviously changed on redefinition.
>
> Storing value copies in a dictionary on assignment is a reasonable
> default behaviour.
>
> However, in this particular case I need to specifically store
> _references to objects_ (e.g. f1 function), or should I say _labels_
> (leading to objects)?
>
> Of course, I can basically update the dictionary with a new function
> definition.
>
> But I wonder, is there not a way _in general_ to specifically store
> references to functions/variables/first-class objects instead of copies
> in a dictionary?

Python stores references in dictionaries and does not copy ! (unless
you explicitly use the copy module) !

In your case the entry in the dictionary is a reference to the same
object which f1 references, that is the object at 0xb7f0ba04.

If you now say "f1=...:" then f1 references a new object
at 0xb7f0b994, and the entry in your dictionary still references
the "old" object at 0xb7f0ba04.

I do not know any method to automatically update your dictionary
as there is no possibility to overload the assignement operator "=".
But may be somebody can teach me a new trick :-)

Greetings, Uwe







More information about the Python-list mailing list