Назначение в вашем цикле эквивалентно:
def function(x):
return function(x) * fun(x)
Это рекурсивная функция без условия остановки.Ваше первоначальное определение function
затенено из-за правил связывания python :
Следующие конструкции связывают имена: формальные параметры для функций, операторы импорта, определения классов и функций (они связывают имя класса или функции в определяющем блоке)
Вы можете отследить это и проверить такое поведение, используя python3 -m trace --trace script.py
:
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x: function(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x: function(x) * fun(x)
# Repeated until a RecursionError is thrown
Вместо этого вы можете связать свою функцию какаргумент лямбды:
fun = lambda x: x**2
function = lambda x: x**2
for i in range(2):
function = lambda x, y=function: y(x) * fun(x)
print(function(2))
, который произведет следующий след:
--- modulename: script, funcname: <module>
script.py(3): fun = lambda x: x**2
script.py(4): function = lambda x: x**2
script.py(5): for i in range(2):
script.py(6): function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(6): function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(8): print(function(2))
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(4): function = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
64