以下是我在学习网站上找到的代码。
callables = []
for i in (1, 2, 3):
callables.append(lambda a=i: a)
for f in callables:
print(f())
为什么我们不能只打印可调用列表
print(callables)
如果我这样做
print(callables)
相反,我得到的输出如下:
[<function at 0x0000022DA8185760>,<0x0000022DA81851C0处的函数>,<0x0000022DA81EB2E0处的函数>]
你当然可以打印
callables
列表,但你可能对输出不满意,因为它不会像你预期的那样显示每个 lambda 函数的结果。让我们来分解一下原因。
当你打印
callables
时,你看到的是列表中每个元素的
表示形式
。由于
callables
包含函数(由你的 lambda 表达式创建),因此打印出的输出表明每个元素都是一个函数,以及它们在内存中的位置(那些
0x...
地址)。
关键在于,打印一个函数并不会
调用
该函数。要查看函数的结果,你需要用
()
调用它,就像你在代码的第二部分所做的那样。
让我们想象一下,函数就像食谱。如果你打印食谱列表,你只会看到食谱的标题,而不是做好的菜肴。要获得菜肴,你需要实际 按照 食谱进行操作。
在你的代码中,循环
for f in callables:
会遍历函数列表。在循环的每次迭代中,
f
成为
callables
中的下一个函数,然后
f()
会
调用
该函数并打印其结果。
如果你想在不实际调用函数的情况下获得更具描述性的输出,你可以修改 lambda 函数以包含更有意义的
__str__
或
__repr__
方法。但这通常不是必需的,因为检查函数本身的主要目的是最终调用它们。