Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
Consider this code example: def example(param=[]): param.append('value') print(param) When example is repeatedly called with an existing list, it repeatedly appends to the list, as ...
#1: Initial revision
Understanding mutable default arguments in Python
Consider this code example: ``` def example(param=[]): param.append('value') print(param) ``` <details><summary> When `example` is repeatedly called with an existing list, it repeatedly appends to the list, as one might expect:</summary> ``` >>> my_list = [] >>> example(my_list) ['value'] >>> example(my_list) ['value', 'value'] >>> example(my_list) ['value', 'value', 'value'] >>> my_list ['value', 'value', 'value'] ``` </details><details><summary>If it's called with an empty list each time, it seems that each empty list is considered separately, which also makes sense:</summary> ``` >>> example([]) ['value'] >>> example([]) ['value'] >>> example([]) ['value'] ``` </details><details><summary>However, if called without passing an argument - using the default - it seems to "accumulate" the appended values as if the same list were being reused:</summary> ``` >>> example() ['value'] >>> example() ['value', 'value'] >>> example() ['value', 'value', 'value'] ``` </details> Some IDEs will warn that `param` is a **"mutable default argument"** and suggest changes. Exactly what does "mutable default argument" mean, and what are the consequences of defining `param` this way? How is this functionality implemented, and what is the design decision behind it? Is it ever useful? How can I avoid bugs caused this way - in particular, how can I make the function work with a new list each time?