Torsten Mohr wrote:

Hi,

i'd like to pass a reference or a pointer to an object
to a function.  The function should then change the
object and the changes should be visible in the calling
function.

There are two possible meanings of "change the object" in Python. One of them will "just work" for your purposes, the other won't work at all.


Python can re-bind a name, or it can mutate an object. Remember, names are just convenient labels that are attached to an object in memory. You can easily move the label from one object to another, and the label isn't affected if the object it's attached to undergoes some sort of change.

Passing a parameter to a function just creates a new label on that object, which can only be seen within that function. The object is the same, though. You can't change what the caller's original label is bound to, but you *can* modify (mutate) the object in place.

>>> def mutate(somedict):
...     somedict['foo'] = 'bar'
...     
>>> def rebind(somedict):
...     somedict = {'foo':'bar'}
...     
>>> d = {'a':1, 'b':2}
>>> rebind(d)
>>> d
{'a': 1, 'b': 2}
>>> mutate(d)
>>> d
{'a': 1, 'b': 2, 'foo': 'bar'}
>>>

In mutate(), we take the object (which is d in the caller, and somedict in the function) and mutate it. Since it's the same object, it doesn't matter where the mutation happened. But in rebind(), we're moving the somedict label to a *new* dict object. Now d and somedict no longer point to the same object, and when the function ends the object pointed to by somedict is garbage-collected, while the object pointed to by d has never changed.

So, to do what you want to do, you simply need to arrange things so that your parameter is an object that can be mutated in-place.

Jeff Shannon
Technician/Programmer
Credit International

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to