循环中的赋值相当于:
def function(x):
return function(x) * fun(x)
这是一个没有停止条件的递归函数。由于python's binding rules,您对function 的初始定义被遮蔽了:
以下构造绑定名称:形式参数到函数,
import 语句、类和函数定义(这些绑定
定义块中的类或函数名)
您可以使用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
您可以将您的函数绑定为 lambda 的参数:
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