2015-11-15 37 views
3

我想创建一个由固定基本函数创建的函数对象组成的函数列表,但函数对象具有不同的输入参数。我已经写了这样的代码:Python中的函数对象

def f_base(name): 
    print "I am %s" % name 

f_list = [] 
for name in ['A', 'B']: 
    f_list.append(
     lambda : f_base(name) 
    ) 

f_list[0]() 
f_list[1]() 

结果是:

I am B 
I am B 

但我想:

I am A 
I am B 

有人能解释为什么Python中产生这样的输出,什么是最简单的如何获得我需要的结果?

回答

3

所有你与lambda功能,现在正呼吁在体内的变量namef_base做。 name变量是在您创建每个函数时调用那些lambda函数和而不是时确定的。

变量name在循环完成后引用'B',因为在循环完成后,python会将for循环中定义的变量保留下来。

这是,如果你做的特别明显,

name = 'C' 

循环后调用函数之前。然后你得到,

I am C 
I am C 

要做到你需要你想要创建一个闭合功能,或可能会更好,使用functools.partial

import functools 

def f_base(name): 
    print "I am %s" % name 

f_list = [] 
for name in ['A', 'B']: 
    f_list.append(
     functools.partial(f_base, name) 
    ) 

f_list[0]() 
f_list[1]() 

将会产生,

I am A 
I am B 
+0

亦称臭名昭著“[后期绑定疑难杂症](http://docs.python-guide.org/en/latest/writing/gotchas/#late-绑定关闭)' – bereal

+0

太棒了!感谢你的回答! – Fomalhaut

1

您可以创建封闭:

def f_base(name): 
    def closure(): 
     print "I am %s" % name 
    return closure 

f_list = [] 
for name in ['A', 'B']: 
    f_list.append(f_base(name)) 
相关问题