Return не прерывает функцию и возвращает None

Есть список списков списков. Необходимо узнать, в каком именно списке лежит искомое значение.

В стеке функций для поиска значения в списках запускается рекурсия, в результате которой в return-е вызывается соседняя функция, которая возвращает имя переменной-списка, в котором лежит искомое значение.

Однако return не прерывает работу родительской функции и в какой-то момент обнуляется, в результате чего возвращается значение None.

Через print всё прекрасно принтуется, но возвращаться не хочет. На визуализаторе гонял полдня, так и не понял в чём проблема. Что я делаю не так?

integers = [7, 32, 657]
mix = [8, (345,353), 'sdfg']

floats = [3.345, 123.67, 435.64]
strings = ['345', 'dfas', 'dfshs']

rhymes = ['fast', 'must', 'dust', 'rust']
rus_rhymes = ['юля', 'пуля', 'гуля', 'пилюля']

nums = [integers, floats]
poems = [rhymes, rus_rhymes]
others = [strings, mix]

global_dictionary = [nums, poems, others]

def display(var):
    for name, value in list(globals().items()):
        if var is value:
            return name


def list_src(lst, value):
    for i in lst:
        if type(i) != list and value == i:
            print(display(lst))
            return display(lst)

        elif type(i) == list: 
            list_src(i, value)


def main():
    print(list_src(global_dictionary, 'dust'))


if __name__ == "__main__":
    main()

# Вывод программы:    
# rhymes - через print в теле функции list_src()
# None - через return

Ответы (2 шт):

Автор решения: Александр

У вас срабатывает второе условие:

elif type(i) == list: 
    list_src(i, value)

А здесь я не вижу инструкции return

→ Ссылка
Автор решения: Sergey Rybakov

Это, конечно, не решение проблемы с непрерыванием функции через первый return в рекурсивном цикле, но сама проблема получения нужного значения в принципе решается через следующий костыль:

  • до объявления функций можно создать пустую глобальную переменную с любым значением;

  • учитывая, что принт делается правильно, то вместо принта и ретёрна можно вызвать эту глобальную переменную и записать в неё полученное значение.

После этого можно тягать это значение через переменную.

integers = [7, 32, 657]
mix = [8, (345,353), 'sdfg']

floats = [3.345, 123.67, 435.64]
strings = ['345', 'dfas', 'dfshs']

rhymes = ['fast', 'must', 'dust', 'rust']
rus_rhymes = ['юля', 'пуля', 'гуля', 'пилюля']

nums = [integers, floats]
poems = [rhymes, rus_rhymes]
others = [strings, mix]

global_dictionary = [nums, poems, others]

LIST_NAME = ''

def display(var):
    for name, value in list(globals().items()):
        if var is value:
            return name


def list_src(lst, value):
    for i in lst:
        if type(i) != list and value == i:
            global LIST_NAME
            LIST_NAME = display(lst)

        elif type(i) == list: 
            list_src(i, value)


def main():
    list_src(global_dictionary, 'dust')
    print(LIST_NAME)


if __name__ == "__main__":
    main()

# Вывод программы:
# rhymes - принт из корня программы (main), т.е. уже после отработки всех остальных функций.
→ Ссылка