Понятно почему так происходит, переменная «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]