[python] "Least Astonishment" and the Mutable Default Argument

This actually has nothing to do with default values, other than that it often comes up as an unexpected behaviour when you write functions with mutable default values.

>>> def foo(a):
    a.append(5)
    print a

>>> a  = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]

No default values in sight in this code, but you get exactly the same problem.

The problem is that foo is modifying a mutable variable passed in from the caller, when the caller doesn't expect this. Code like this would be fine if the function was called something like append_5; then the caller would be calling the function in order to modify the value they pass in, and the behaviour would be expected. But such a function would be very unlikely to take a default argument, and probably wouldn't return the list (since the caller already has a reference to that list; the one it just passed in).

Your original foo, with a default argument, shouldn't be modifying a whether it was explicitly passed in or got the default value. Your code should leave mutable arguments alone unless it is clear from the context/name/documentation that the arguments are supposed to be modified. Using mutable values passed in as arguments as local temporaries is an extremely bad idea, whether we're in Python or not and whether there are default arguments involved or not.

If you need to destructively manipulate a local temporary in the course of computing something, and you need to start your manipulation from an argument value, you need to make a copy.

Examples related to python

programming a servo thru a barometer Is there a way to view two blocks of code from the same file simultaneously in Sublime Text? python variable NameError Why my regexp for hyphenated words doesn't work? Comparing a variable with a string python not working when redirecting from bash script is it possible to add colors to python output? Get Public URL for File - Google Cloud Storage - App Engine (Python) Real time face detection OpenCV, Python xlrd.biffh.XLRDError: Excel xlsx file; not supported Could not load dynamic library 'cudart64_101.dll' on tensorflow CPU-only installation

Examples related to language-design

Why are C++ inline functions in the header? Why does Java have an "unreachable statement" compiler error? Why does Lua have no "continue" statement? Why is there no multiple inheritance in Java, but implementing multiple interfaces is allowed? Why doesn't Python have a sign function? "Least Astonishment" and the Mutable Default Argument What does void mean in C, C++, and C#? What does DIM stand for in Visual Basic and BASIC? Why doesn't Java support unsigned ints? Why can't I have abstract static methods in C#?

Examples related to default-parameters

Using an attribute of the current class instance as a default value for method's parameter T-SQL - function with default parameters C default arguments "Least Astonishment" and the Mutable Default Argument Does Java support default parameter values? Set a default parameter value for a JavaScript function

Examples related to least-astonishment

"Least Astonishment" and the Mutable Default Argument