@Dinxor

Почему результат выполнения функции сохраняется между вызовами?

Столкнулся со странным поведением функции, не понимаю, почему так происходит
def test(n, rez = []):
    for i in range(n):
        rez.append(i)
    return rez

print(test(3))
# [0, 1, 2] - тут всё понятно

print(test(4))
# [0, 1, 2, 0, 1, 2, 3] - а тут откуда результат первого вызова?

print(test(5, []))
# [0, 1, 2, 3, 4] - так работает
  • Вопрос задан
  • 74 просмотра
Решения вопроса 2
Maksim_64
@Maksim_64
Data Analyst
Потому что объект список мутабельный объект rez = []. Ты ожидаешь, что при каждом новом вызове функции у тебя создается пустой список res, а это не так почитай к чему ведет мутабельные типы в качестве значений по умолчанию у параметров функции.

1. В первом случае ты вызываешь первый раз работает как ожидаешь, но но список res уже создан и существует.
2. В втором ты оставляешь без изменения свой дефолтный параметр (список), а он то уже заполнен, и он просто добавляет в него.
3. В третьем случе ты передаешь новый список (новый объект). По этому работает нормально.

Общий кейс для решения таких проблем как то так.
def test(n, rez = None):
    if rez is None:
        rez = []
    for i in range(n):
        rez.append(i)
    return rez
Ответ написан
Комментировать
IvanU7n
@IvanU7n
nothing interesting here
гугление "python default argument" выдаёт
Python's default arguments are evaluated once when the function is defined, not each time the function is called
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы