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)
但它比前一种方法复杂得多.
您的所有函数都引用相同的变量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)
| 归档时间: |
|
| 查看次数: |
5856 次 |
| 最近记录: |