===== Default arguments in Python are evaluated only once ==== Python’s default arguments are evaluated //once// when the function is defined, not each time the function is called. Consider for example % cat test_defaults.py import datetime import time def test_defaults(prefix, now=datetime.datetime.now()): print(prefix, now) test_defaults('one') time.sleep(1) test_defaults('two') time.sleep(1) test_defaults('three', datetime.datetime.now()) time.sleep(1) test_defaults('four') which outputs: % python3 test_defaults.py one 2021-08-14 20:13:27.830082 two 2021-08-14 20:13:27.830082 three 2021-08-14 20:13:29.832481 four 2021-08-14 20:13:27.830082 Notice that 'one', 'two' and 'four' have the same time. It changes only when it is explicitly overridden. ==== References ==== * https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments - It is worth reading this article once end-to-end. It explains the same concept in a better way with a different example. It also goes over two more common python gotchas. Well written with high information density. * https://www.mail-archive.com/python-list@python.org/msg443694.html - I got the initial version of this script from here.