2017-04-18 90 views
2

我的一个函数会使用外部变量,但是当我使用这个函数时外部变量会改变。这里有一个例子:在python中定义函数时锁定外部变量

func_list=[] 
for i in range(0,6): 
    def func(): 
     print(i) 
    func_list.append(func) 
for j in range(0,6): 
    func_list[j]() 

我希望输出[1,2,3,4,5,6],但实际输出为[6,6,6,6,6,6] 我所知道的一个解决方案是使用封闭,像这样:

func_list=[] 
for i in range(0,6): 
    def create_func(): 
     nonlocal i 
     number=i 
     def func(): 
      print(number) 
     return func 
    func=create_func() 
    func_list.append(func) 
for j in range(0,6): 
    func_list[j]() 

此程序可输出[1,2,3,4,5,6]。但它看起来有点难看。它使用额外的4条,至少3条线来解决这个问题...是否有一些更简单的方法/函数装饰来解决这个问题?

谢谢。

回答

0

试试这个:

func_list=[] 
for i in range(0,6): 
    def func(i = i): 
     print(i) 
    func_list.append(func) 

for j in range(0,6): 
    func_list[j]() 

它的工作原理,因为i在函数定义评估其价值投入作为默认的关键字参数,而不是变量

当然,如果您需要传递一个名为i的关键字参数,则会崩溃,在这种情况下,您可能想要使用您提供的(丑陋的)解决方案。

+0

谢谢,这就是我想要的。也许这是最好的解决方案。 –

+0

@ X.Li你可以试试[这个更好的答案](http://stackoverflow.com/questions/3431676/creating-functions-in-a-loop#3431699)。我在回答这个问题后很快发现它。 – anonymoose

+0

谢谢你,我看到了。这可能是一个很好的答案。但你的回答对我来说已经足够了。 –