flist=[] for i in range(3): def func(x): return x * i flist.append(func) for f in flist: print(f(2)) 如何改写上述代码解决上一个问题的功能bug,正确运行结果(0,2,4)
时间: 2023-06-01 19:07:53 浏览: 133
可以修改代码如下:
flist = []
for i in range(3):
def func(x, i=i):
return x * i
flist.append(func)
for f in flist:
print(f(2))
输出结果为:0 2 4。
在修改后的代码中,将变量i作为默认参数传递给了函数func,这样每个函数func的i值就被固定为了循环变量i的值,就可以避免上一个代码中所遇到的问题了。
相关问题
flist = [] for i in range(3): def func(x): return x * i flist.append(func) for f in flist: print(f(2)) 如何改写上述代码解决上一个问题的功能bug,正确运行结果(0,2,4)
上述代码的问题在于,列表 flist 中的每个函数都使用了 i 变量,而这个变量在 for 循环结束后不会消失,最终的结果是 i 的值为 2,因此 flist 中的函数都会返回 4。为了解决这个问题,可以使用 Python 的闭包机制,将 i 的值绑定到函数中,而不是直接使用循环变量。改写后的代码如下:
flist = []
for i in range(3):
def func(x, i=i):
return x * i
flist.append(func)
for f in flist:
print(f(2))
这段代码使用了默认参数 i=i,将 i 的值绑定到每个函数中。这样,每个函数都会使用自己绑定的 i 值,而不会受到循环变量 i 的影响。运行结果为 0、2、4,符合预期。
flist.append(lambda x, i=i: x * i)这句代码什么意思
这段代码实现了一个 lambda 函数,将 x 乘以一个变量 i,然后将这个 lambda 函数添加到 flist 列表中。在添加时,使用了 i=i 的 trick,将循环中的变量 i 作为默认参数传递给 lambda 函数,以避免在循环中出现变量绑定问题。
阅读全文