Good uses for mutable function argument default values?
It is a common mistake in Python to set a mutable object as the default value of an argument in a function. Here's an example taken from this excellent write-up by David Goodger:
>>> def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
>>> print bad_append('one')
['one']
>>> print bad_append('two')
['one', 'two']
The explanation why this happens is here.
And now for my question: Is there a good use-case for this syntax?
I mean, if everybody who encounters it makes the same mistake, debugs it, understands the issue and from thereon tries to avoid it, what use is there for such syntax?
Solution 1:
You can use it to cache values between function calls:
def get_from_cache(name, cache={}):
if name in cache: return cache[name]
cache[name] = result = expensive_calculation()
return result
but usually that sort of thing is done better with a class as you can then have additional attributes to clear the cache etc.
Solution 2:
Canonical answer is this page: http://effbot.org/zone/default-values.htm
It also mentions 3 "good" use cases for mutable default argument:
- binding local variable to current value of outer variable in a callback
- cache/memoization
- local rebinding of global names (for highly optimized code)