Callback scoping

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dan

    #1

    Callback scoping

    So, I think I understand what python's scoping is doing in the
    following situation:
    >>x = [ lambda: ind for ind in range(10) ]
    >>x
    [<function <lambdaat 0x00BEC070>, <function <lambdaat 0x00BEC7F0>,
    <function <lambdaat 0x00BECA70>, <function <lambdaat 0x00C1EBF0>,
    <function <lambdaat 0x00C1EE30>, <function <lambdaat 0x00C228F0>,
    <function <lambdaat 0x00C228B0>, <function <lambdaat 0x00C28730>,
    <function <lambdaat 0x00C286F0>, <function <lambdaat 0x00C287F0>]
    >>x[0]()
    9
    >>x[5]()
    9
    >>x[9]()
    9
    >>ind
    9
    >>ind = 2
    >>x[0]()
    2
    >>>
    But, I'm wondering what is the easiest (and/or most pythonic) way to
    get the behavior I want? (If you haven't guessed, I want a list of (no
    parameter) functions, each of which returns its index in the list.)

    -Dan

  • Marc 'BlackJack' Rintsch

    #2
    Re: Callback scoping

    On Thu, 05 Jul 2007 19:14:07 +0000, Dan wrote:
    So, I think I understand what python's scoping is doing in the
    following situation:
    >>>x = [ lambda: ind for ind in range(10) ]
    >
    […]
    >
    But, I'm wondering what is the easiest (and/or most pythonic) way to
    get the behavior I want? (If you haven't guessed, I want a list of (no
    parameter) functions, each of which returns its index in the list.)
    Default arguments are evaluated when the function is defined:

    In [15]: x = [lambda x=i: x for i in xrange(10)]

    In [16]: x[0]()
    Out[16]: 0

    In [17]: x[5]()
    Out[17]: 5

    Ciao,
    Marc 'BlackJack' Rintsch

    Comment

    • Nick Craig-Wood

      #3
      Re: Callback scoping

      Dan <thermostat@gma il.comwrote:
      So, I think I understand what python's scoping is doing in the
      following situation:
      >x = [ lambda: ind for ind in range(10) ]
      >
      But, I'm wondering what is the easiest (and/or most pythonic) way to
      get the behavior I want? (If you haven't guessed, I want a list of (no
      parameter) functions, each of which returns its index in the list.)
      This is the traditional way :-
      >>x = [ lambda ind=ind: ind for ind in range(10) ]
      >>x[0]()
      0
      >>x[2]()
      2
      >>x[9]()
      9
      >>>
      --
      Nick Craig-Wood <nick@craig-wood.com-- http://www.craig-wood.com/nick

      Comment

      Working...