Уведомления

Группа в Telegram: @pythonsu

#1 Май 18, 2022 12:37:28

orel_da
Зарегистрирован: 2021-08-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

Разбираю работу рекурсивной функции

 def gen_numbers(N:int, M:int, prefix = None):
    """Генерирует все числа в системе счисления N,
       колво позиций M, prеfix - полученное число, тип список
    """
    prefix = prefix or []
    if M==0:
        print(prefix)
    else:
        for digit in range(N):
            prefix.append(digit)
            gen_numbers(N, M-1, prefix)
            prefix.pop()

Вопрос: почему не работает, если в цикле изменить код так:
         for digit in range(N):
            gen_numbers(N, M-1, prefix.append(digit))
Как я мыслю: сначала вычисляются параметры, потом идет вызов функции. При вызове функции создается копия списка prefix. Что не так?

Офлайн

#2 Май 18, 2022 13:23:51

orel_da
Зарегистрирован: 2021-08-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

Видимо, связано с какими-то свойствами типа list. Если переделать со строкой, то работает

 def gen_numbers(N:int, M:int, prefix = ""):
    """Генерирует все числа в системе счисления N,
       колво позиций M, prеfix - полученное число
    """
    if M==0:
        print(prefix)
    else:
        for digit in range(N):
            gen_numbers(N, M-1, prefix + str(digit))
           

Офлайн

#3 Май 18, 2022 14:20:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

 prefix.append(digit)
orel_da
При вызове функции создается копия списка prefix.
append не создает копию списка, с чего вы это вообще взяли?



Офлайн

#4 Май 18, 2022 14:56:28

orel_da
Зарегистрирован: 2021-08-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

FishHook
append конечно не создает копию списка. Создается копия списка для функции gen_numbers, когда этот список передается в аргументы.
как я думаю:
1. создается копия prefix
2. добавляется копии списка в конец digit (append)
3. отдается функции gen_number на выполнение
и так при каждом вызове функции gen_number создается своя копия списка prefix

В чем я ошибаюсь?

Офлайн

#5 Май 18, 2022 15:49:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

Офлайн

#6 Май 18, 2022 17:10:07

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

 gen_numbers(N, M-1, prefix.append(digit))

prefix.append(digit) - этот метод возвращает None и это None вы передаете аргументом равносильно
 gen_numbers(N, M-1, None)

Офлайн

#7 Май 19, 2022 12:51:02

orel_da
Зарегистрирован: 2021-08-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вычисление аргумента для функции когда происходит?

xam1816
Поняла, спасибо. Когда я метод
 prefix.append(digit)
вызываю в отдельной строке, то меняется список prefix, а сам метод возвращает None. Если я передаю выражение
 prefix.append(digit)
как аргумент функции, то я на самом деле передаю не список, а то, что возвращает функция append, то есть None.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version