Считается ли функция lamdba: () внутри одной и той же функции рекурсивной?

#python #python-3.x #tkinter #recursion #lambda

Вопрос:

Я смотрел этот учебник о том, как сделать средство просмотра изображений:

https://www.youtube.com/watch?v=zg4c92pNFeoamp;t=1186s

В основном мой вопрос заключается в том, считается ли эта часть кода рекурсивной или нет, и почему:

 def forward(image_number):
    global my_label
    global button_forward
    global button_back

    my_label.grid_forget()
    my_label = tk.Label(image=image_list[image_number-1])
    button_forward = tk.Button(root, text=">>", command=lambda:forward(image_number 1))    #is this recursive?
    button_back = tk.Button(root, text="<<", command=lambda:back(image_number-1))
 

Комментарии:

1. Не по теме, но это действительно плохая практика-создавать новую кнопку при каждом щелчке, накладывая ее друг на друга. Следует просто сделать button.config(command=...) это вместо этого.

Ответ №1:

Нет. forward не называет себя, прямо или иначе. Он просто создает кнопку, которая может позвонить forward в какой-то момент в будущем. (Я предполагаю, что forward завершается без фактического запуска функции обратного вызова кнопки. Если бы это было так, я бы счел это чем-то вроде серой зоны.)

Комментарии:

1. Если бы это вызвало обратный вызов, то это была бы взаимная рекурсия

2. Это странный вид, в зависимости от того, что на самом деле вызывает обратный вызов.

3. не так ли ? это опечатка?

4. Похоже, что он демонстрирует потенциально рекурсивное поведение , но на самом деле он нерекурсивен, если пользователь никогда не запускает обратный вызов. Кроме того, чтобы соответствовать формальному определению в математике (найденному в Википедии), потребуется вернуть один или несколько терминальных сценариев, которые не используют рекурсию.