Я думаю, что проблема, вероятно, в том, что вы передаете изменяемые объекты в ваш рекурсивный вызов. В частности, downstream_options
и current_element
являются диктовками, и когда вы изменяете их в рамках данной рекурсии функции, вы также изменяете их на уровне выше, что в данном случае, кажется, оставляет вас при попытке присвоить значение в диктовке само по себе (или какая-то такая невозможность, мне не совсем удалось проследить логику c).
Быстрое решение может быть (я не уверен, если это сломает вашу логику c) чтобы сделать копию этих диктов при каждой рекурсии:
from copy import deepcopy
...
downstream_elements = get_all_allocation_proposals(downstream_budget,
deepcopy(downstream_options),
deepcopy(current_element))
Кроме того, как указано в комментариях, вы должны избегать использования изменяемого аргумента по умолчанию, то есть upstream_element=dict()
. Это может привести к очень запутанному поведению, если вы на самом деле используете значение по умолчанию (которого вы не видите в своем коде)