2017-10-14 66 views
-2

任何人都可以解释为什么下面代码的输出是0,1,2,3,4?python中变量的LEGB范围

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

这里的问题是一个可变范围问题,可以通过遵循一般的最佳实践并且不给变量使用相同的名称来轻松避免。

在第一个for循环中,您正在创建一堆函数并将它们附加到列表中。在第二个for循环中,您可以从列表中调用这些函数中的每一个,然后执行。在函数f的定义中,您给参数i的默认值为i。如果分配了全局变量i的值,则本地函数参数i(第一个)会随着每次循环迭代而递增。在函数f内,print语句打印局部变量i(由于变量作用域规则)。第一个for循环的结果是5个函数的列表,其中列出了本地参数i,但是对于每个函数,本地参数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

+0

感谢MacKenzie让我清楚:) –