Найти - Пользователи
Полная версия: Вычисление аргумента для функции когда происходит?
Начало » Python для новичков » Вычисление аргумента для функции когда происходит?
1
orel_da
Разбираю работу рекурсивной функции
 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. Что не так?
orel_da
Видимо, связано с какими-то свойствами типа 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))
           
FishHook
 prefix.append(digit)
orel_da
При вызове функции создается копия списка prefix.
append не создает копию списка, с чего вы это вообще взяли?
orel_da
FishHook
append конечно не создает копию списка. Создается копия списка для функции gen_numbers, когда этот список передается в аргументы.
как я думаю:
1. создается копия prefix
2. добавляется копии списка в конец digit (append)
3. отдается функции gen_number на выполнение
и так при каждом вызове функции gen_number создается своя копия списка prefix

В чем я ошибаюсь?
xam1816
 gen_numbers(N, M-1, prefix.append(digit))

prefix.append(digit) - этот метод возвращает None и это None вы передаете аргументом равносильно
 gen_numbers(N, M-1, None)
orel_da
xam1816
Поняла, спасибо. Когда я метод
 prefix.append(digit)
вызываю в отдельной строке, то меняется список prefix, а сам метод возвращает None. Если я передаю выражение
 prefix.append(digit)
как аргумент функции, то я на самом деле передаю не список, а то, что возвращает функция append, то есть None.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB