storing references instead of copies in a dictionary
John Machin
sjmachin at lexicon.net
Thu Jul 17 08:29:44 EDT 2008
On Jul 17, 9:45 pm, 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.
I wouldn't put it like that. You have created a new function, with a
different address to the original function, and bound the name "f1" to
that new function. The address of the old function is still stored in
the dictionary.
A function (or any other object) can have 0, 1, or many names:
>>> def foo():
... print "The function formerly known as foo"
...
>>> fred = foo # 2 names
>>> del foo # back to one name
>>> fred()
The function formerly known as foo
>>> L = [fred]
>>> del fred # 0 names
>>> L[0]() # You can't keep a good function down ...
The function formerly known as foo
>>>
> Of course, I can basically update the dictionary with a new function
> definition.
Uh-huh ...
>
> 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?
Yup, and that's what happens all the time, unless you explicitly make
a copy ... some objects have a copy method, sequences can be copied by
taking a full slice (seq_copy = seq[:]), otherwise read up on the copy
module.
More information about the Python-list
mailing list