We're back after a server migration that caused effbot.org to fall over a bit harder than expected. Expect some glitches.

How do I write a function with output parameters (call by reference)?

Python doesn’t support call by reference; a called function only has access to the argument values (the actual objects), not the variables in the calling scope.

To return multiple values, you can simply return a tuple, and use sequence unpacking at the call site:

def func(a, b):
    a = 'new-value'        # a and b are local names
    b = b + 1              # assigned to new objects
    return a, b            # return new values

x, y = 'old-value', 99
x, y = func(x, y)
print x, y                 # output: new-value 100

This is almost always the clearest solution, but can cause problems if you find that need to add more return values.

A more flexible approach is to return either a dictionary or a custom class instance. Dictionaries are easy to create, but can be a bit unwieldy to unpack:

def func(a, b):
    return dict(a='new-value', b=b+1)

result = func(x, y)
print result["a"], result["b"]

Custom classes require a bit more typing, but are easier to use at the call site:

class result_container:

def func(a, b):
    result = result_container()
    result.a = 'new-value'
    result.b = b + 1
return result

result = func(x, y)
print result.a, result.b

Extending the container class to support dictionary-style creation is also easy:

class result_container:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs) # copy arguments to attributes

def func(a, b):
    return result_container(a='new-value', b=b+1)

result = func(x, y)
print result.a, result.b

Finally, you can return multiple values from a function by passing in a mutable object, such as a list, a dictionary, or a custom object. This example uses a list:

def func(a):
    a[0] = 'new-value'     # 'a' references a mutable list
    a[1] = a[1] + 1        # changes a shared object

args = ['old-value', 99]
print args[0], args[1]     # output: new-value 100

And this uses a dictionary:

def func(args):
    args['a'] = 'new-value'     # args is a mutable dictionary
    args['b'] = args['b'] + 1   # change it in-place

args = {'a':' old-value', 'b': 99}
print args['a'], args['b']

CATEGORY: programming