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
Это, конечно, не решение проблемы с непрерыванием функции через первый 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), т.е. уже после отработки всех остальных функций.