Пример изменяемых значений аргументов по умолчанию с использованием словаря Python

Понятно почему так происходит, переменная «b» по факту хранит ссылку на список «a». Меняя «b» меняем и значение содержащиеся в «a».

>>> a = [1,2,3]
>>> b = a
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> b[0] = -1
>>> a
[-1, 2, 3]
>>> b
[-1, 2, 3]


Не хотим этого, делаем как рекомендует документация:

>>> a = [1,2,3]
>>> b = list(a)
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> b[0] = -1
>>> a
[1, 2, 3]
>>> b
[-1, 2, 3]

Я встал на грабли в такой ситуации:

def func(a, k=[]):
    k.append(a)
    return k

print(func(1))
print(func(2))
print(func(3))

#  вывод
[1]
[1, 2]
[1, 2, 3]

Думал будет выведено:

[1]
[2]
[3]

Правильное решение, если нужно избежать поведения выше описанного:

def func(a, k=None):
    if k == None:
        k = []
    k.append(a)
    return k

print(func(1))
print(func(2))
print(func(3))

#  вывод
[1]
[2]
[3]