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

This is not a design flaw. Anyone who trips over this is doing something wrong.

There are 3 cases I see where you might run into this problem:

  1. You intend to modify the argument as a side effect of the function. In this case it never makes sense to have a default argument. The only exception is when you're abusing the argument list to have function attributes, e.g. cache={}, and you wouldn't be expected to call the function with an actual argument at all.
  2. You intend to leave the argument unmodified, but you accidentally did modify it. That's a bug, fix it.
  3. You intend to modify the argument for use inside the function, but didn't expect the modification to be viewable outside of the function. In that case you need to make a copy of the argument, whether it was the default or not! Python is not a call-by-value language so it doesn't make the copy for you, you need to be explicit about it.

The example in the question could fall into category 1 or 3. It's odd that it both modifies the passed list and returns it; you should pick one or the other.

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