一道很有意思的面试题’
def func():
acts=[]
for i in range(5):
acts.append(lambda x:i**x)
return acts
acts=func()
print(acts[0](2))
print(acts[1](2))
print(acts[2](2))
print(acts[3](2))
猜猜看结果是什么?
相信很多人的答案都是:0,1,4,9
但实际结果是:16,16,16,16
为什么?
acts返回的是一个全是lambda表达式的列表,给x赋值后调用lambda表达式,按常规思想是直接调用每一个不同的i,但是由于嵌套作用域中的变量只有在该嵌套函数被调用时才进行查找参数的值,所有后面每次调用的都是在最后一次循环迭代中循环变量的值,也就是说每次i的值都是4,所有结果就不是我们所想的那样。那么,如何实现想要的结果?
def func():
acts=[]
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts
acts=func()
print(acts[0](2))
print(acts[1](2))
print(acts[2](2))
print(acts[3](2))
经过修改,将每次的i赋值给默认参数i,这样调用的时候就可以调用到所需的i,结果也变成了想要的结果:0,1,4,9
#结语:新手练手之作,不满之处敬请见谅#
`‘’