Переменная внутри рекурсивной функции не сбрасывается при повторном вызове основной функции в Python [дубликат]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Переменная внутри рекурсивной функции не сбрасывается при повторном вызове основной функции в Python [дубликат]

Сообщение Anonymous »

У меня есть рекурсивная функция, которая возвращает ключи вложенных словарей, сгруппированные по их рангу (глубине вложенности):
def nestedDictValues(d, values={}, rank=0):
if not rank in values:
values[rank] = []
for k in d:
if type(d[k]) is dict:
values = nestedDictValues(d[k], values, rank+1)
if not k in values[rank]:
values[rank].append(k)
return values

testDict = {"A": {"B": "",
"C": ""},
"D": {"E": ""}
}


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

nestedDictValues(testDict["A"] )

{0: ['B', 'C']

Если я запущу функцию во второй раз с клавиши "Е" получаю неожиданный результат:

nestedDictValues(testDict["D"])

{0: ['B', 'C', 'E']} # Вместо { 0: ['E']

Как это вообще возможно? Почему «значения» сохраняют данные с первого запуска?
Мне удалось решить эту проблему, перезапустив «значения» в самой первой рекурсии, но я не понимаю, как именно это работает
def nestedDictValues(d, values={}, rank=0, firstCall=True):
if firstCall: values = {}
if not rank in values:
values[rank] = []
for k in d:
if type(d[k]) is dict:
values = nestedDictValues(d[k], values, rank, firstCall=False)
if not k in values[rank]:
values[rank].append(k)
return values


Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-a-sec
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»