python中

时间:2017-10-14 02:45:42

标签: python

任何人都可以解释为什么下面代码的输出是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)会发生什么?

1 个答案:

答案 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