Например, при написании рекурсивной функции, которая должна передавать что-то изменяемое, например, список. Пример игрушки:
def foo(collected=None, level=0, max_depth=3):
if collected is None: # first call!
collected = []
collected.append(level)
print(collected)
if level < max_depth:
foo(collected, level + 1, max_depth)
foo()
# output:
# [0]
# [0, 1]
# [0, 1, 2]
# [0, 1, 2, 3]
Аргумент по умолчанию для collected
используется так, что первому вызывающему абоненту не нужно указывать collected=[]
.
None
используется вместо []
в качестве значения по умолчанию, так что мутации в collected
не сохраняются во время вызовов (изменяемый аргумент Python по умолчанию) -
def foo(collected=[], level=0, max_depth=3):
collected.append(level)
print(collected)
if level < max_depth:
foo(collected, level + 1, max_depth)
foo()
# output:
# [0]
# [0, 1]
# [0, 1, 2]
# [0, 1, 2, 3]
foo()
# output:
# [0, 1, 2, 3, 0]
# [0, 1, 2, 3, 0, 1]
# [0, 1, 2, 3, 0, 1, 2]
# [0, 1, 2, 3, 0, 1, 2, 3]