Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #33393 > unrolled thread
| Started by | MRAB <python@mrabarnett.plus.com> |
|---|---|
| First post | 2012-11-15 16:27 +0000 |
| Last post | 2012-11-15 16:27 +0000 |
| Articles | 1 — 1 participant |
Back to article view | Back to comp.lang.python
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: Dictionary of Functions MRAB <python@mrabarnett.plus.com> - 2012-11-15 16:27 +0000
| From | MRAB <python@mrabarnett.plus.com> |
|---|---|
| Date | 2012-11-15 16:27 +0000 |
| Subject | Re: Dictionary of Functions |
| Message-ID | <mailman.3718.1352996847.27098.python-list@python.org> |
On 2012-11-15 16:04, Kevin Gullikson wrote:
> Hi all,
>
> I am trying to make a dictionary of functions, where each entry in the
> dictionary is the same function with a few of the parameters set to
> specific parameters. My actual use is pretty complicated, but I managed
> to boil down the issue I am having to the following example:
>
> In [1]: def test_fcn(a, x):
> ...: return a*x
> ...:
>
> In [2]: fcn_dict = {}
>
> In [3]: for i in [1,2,3]:
> ...: fcn_dict[i] = lambda x: test_fcn(i, x)
> ...:
>
> In [4]: fcn_dict
> Out[4]:
> {1: <function <lambda> at 0x102b42c08>,
> 2: <function <lambda> at 0x102b42b18>,
> 3: <function <lambda> at 0x102b42c80>}
>
> In [5]: fcn_dict[1](5)
> Out[5]: 15
>
> In [6]: fcn_dict[2](5)
> Out[6]: 15
>
> In [7]: fcn_dict[3](5)
> Out[7]: 15
>
>
> As you can see, all of the functions are returning the value that I want
> for fcn_dict[3]. If I make separate functions for each case instead of a
> dictionary it works, but I would really prefer to use dictionaries if
> possible. Is there a way to make this work?
>
It's looking up 'i' at the time that the function is called, which is
after the 'for' loop has finished and 'i' has been left as 3.
What you need to do is capture the current value of 'i'. The usual way
is with a default argument:
for i in [1,2,3]:
fcn_dict[i] = lambda x, i=i: test_fcn(i, x)
Back to top | Article view | comp.lang.python
csiph-web