任何人都可以解释为什么下面代码的输出是0,1,2,3,4?
fun=[]
for i in range(5):
def f(i=i):
#i=10
print(i)
fun.append(f)
#print(fun,i)
for f in fun:
f()
如果给出默认值(i = i)会发生什么?
答案 0 :(得分:1)
这里的问题是变量范围问题,可以通过遵循一般最佳实践并且不给变量赋予相同名称来轻松避免。
在第一个for循环中,您将创建一组函数并将它们附加到列表中。在第二个for循环中,您从列表中调用这些函数中的每一个并执行它。在函数f
的定义中,您为参数i
提供了默认值i
。如果赋值为全局变量i
的值,则为本地函数参数i
(第一个),该值随每次循环迭代递增。在函数f
内部,print语句打印局部变量i
(因为变量范围规则)。第一个for循环的结果是打印本地参数i
的5个函数的列表,但是对于每个函数,本地参数i
都被赋予了不同的默认值。
这段代码可以更清楚地写成:
function_list = []
for index in range(5):
def print_func(val=index):
print(val)
function_list.append(print_func)
for func in function_list:
func()
这消除了所有冲突的变量和函数名称,使代码更具可读性和可理解性。
有关可变范围的更多信息,请阅读http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html。