Rotwang <sg...@hotmail.co.uk> writes: > On 11/02/2011 06:19, Paul Rubin wrote: >> Rotwang<sg...@hotmail.co.uk> writes: >>> menu = Tkinter.Menu(master, tearoff = 0) >>> for k in x: >>> def f(j = k): >>> [do something that depends on j] >>> menu.add_command(label = str(k), command = f) >>> >>> Still, I'd like to know if there's a more elegant method for creating >>> a set of functions indexed by an arbitrary list. >> >> That is a standard python idiom. These days maybe I'd use partial >> evaluation: >> >> from functools import partial >> >> def f(k): whatever... >> >> for k in x: >> menu.add_command(label=str(k), command=partial(f, k)) > > functools is new to me, I will look into it. Thanks. > > >> the "pure" approach would be something like >> >> def f(k): whatever... >> >> for k in x: >> menu.add_command(label=str(k), >> command=(lambda x: lambda: f(x))(k)) > > I don't understand why this works. What is the difference between > > (lambda x: lambda: f(x))(k) >
The value of k is bound to the local variable x; If k is changed later, it doesn't affect the value of x above Note that you can also write it: lambda k=k: f(k) > and > > lambda: f(k) > > ? K not being local, If k is changed later, it does affect the above. -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list