如何在循环内定义函数

now*_*wox 4 python function-pointers

为什么这不起作用?

u = {}
for me in ['foo', 'bar']:
   def callback():
       return 'I am %s' % me
   u[me] = callback
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

>>> u['foo']()
'I am bar'
Run Code Online (Sandbox Code Playgroud)

似乎callback在最新的迭代中定义了一次.

编辑

正如kawadhiya21所提出的,类方法可行:

class CallbackFactory():
    def __init__(self, me):
       self.me = me

    def __call__(self):
       return 'I am %s' % self.me

u = {}
for me in ['foo', 'bar']:

   u[me] = CallbackFactory(me)
Run Code Online (Sandbox Code Playgroud)

但它比前一种方法复杂得多.

khe*_*ood 8

您的所有函数都引用相同的变量me.当你尝试调用函数时,me有值'bar',因为这就是循环结束时的情况.

如果要me为函数的每个定义采用不同的值,则每个函数都需要自己的变量副本.

u = {}
for me in ['foo', 'bar']:
   def callback(me_copy=me):
       return 'I am %s' % me_copy
   u[me] = callback
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其缩短为:

u = {}
for me in ['foo', 'bar']:
   u[me] = lambda me_copy=me: 'I am %s'%me_copy
Run Code Online (Sandbox Code Playgroud)

甚至

u = { me: (lambda me_copy=me: 'I am %s'%me_copy) for me in ('foo', 'bar') }
Run Code Online (Sandbox Code Playgroud)