Search code examples
pythondefault-parameters

How can I avoid issues caused by Python's early-bound default parameters (e.g. mutable default arguments "remembering" old data)?


Sometimes it seems natural to have a default parameter which is an empty list. However, Python produces unexpected behavior in these situations.

For example, consider this function:

def my_func(working_list=[]):
    working_list.append("a")
    print(working_list)

The first time it is called, the default will work, but calls after that will update the existing list (with one "a" each call) and print the updated version.

How can I fix the function so that, if it is called repeatedly without an explicit argument, a new empty list is used each time?


Solution

  • def my_func(working_list=None):
        if working_list is None: 
            working_list = []
    
        # alternative:
        # working_list = [] if working_list is None else working_list
    
        working_list.append("a")
        print(working_list)
    

    The docs say you should use None as the default and explicitly test for it in the body of the function.

    Aside

    x is None is the comparison recommended by PEP 8:

    Comparisons to singletons like None should always be done with is or is not, never the equality operators.

    Also, beware of writing if x when you really mean if x is not None [...]

    See also What is the difference between "is None" and "== None"