【发布时间】:2021-09-27 20:27:05
【问题描述】:
看看这段代码。我正在创建 3 个 lambda 函数列表(存储在变量 plus_n、plus_n_ 和 plus_n__ 中)。他们应该是完全一样的。但是,只有 plus_n_ 显示了预期的行为。
MAX=5
plus_n=[lambda x: x+i for i in range(MAX)]
plus_n_=[]
for i in range(MAX):
plus_n_.append(lambda x: x+i)
def all_plus_n():
plus_ns=[]
for i in range(MAX):
plus_ns.append(lambda x: x+i)
return plus_ns
plus_n__=all_plus_n()
for i in range(len(plus_n)):
print('plus_n[{}]({})={}'.format(i,3,plus_n[i](3)))
print('plus_n_[{}]({})={}'.format(i,3,plus_n_[i](3)))
print('plus_n__[{}]({})={}'.format(i,3,plus_n__[i](3)))
print()
输出:
plus_n[0](3)=7
plus_n_[0](3)=3
plus_n__[0](3)=7
plus_n[1](3)=7
plus_n_[1](3)=4
plus_n__[1](3)=7
plus_n[2](3)=7
plus_n_[2](3)=5
plus_n__[2](3)=7
plus_n[3](3)=7
plus_n_[3](3)=6
plus_n__[3](3)=7
plus_n[4](3)=7
plus_n_[4](3)=7
plus_n__[4](3)=7
看,如果是在函数上或在综合列表中,完全相同的代码会给出不同的结果...
那么,这 3 种方法之间有什么区别?怎么了? 如果我想在多个函数中使用这个变量,我必须将它用作全局变量吗?因为似乎我不能使用函数来获取变量值...
Tks 提前。
【问题讨论】:
-
区别在于每个 lambda 是共享相同的
i还是不同的i范围。 -
这能回答你的问题吗? What do (lambda) function closures capture?