Generator Comprehensions

Skip Montanaro skip at pobox.com
Tue Jan 29 09:36:10 EST 2002


    >> It has always bothered me that the temporary variables inside list
    >> comprehensions are still visible afterwards (and overwrite existing
    >> variables):

    Jason> Wow.  I wasn't aware of that.  But now that I am, it bothers me.

I don't see any spurious locals:

    >>> def f(n):
    ...   l = [i for i in range(n)]
    ...   print locals()
    ...   return l
    ... 
    >>> f(5)
    {'i': 4, 'l': [0, 1, 2, 3, 4], 'n': 5}
    [0, 1, 2, 3, 4]

When you disassemble the function you see a strange local named "_[1]":

    >>> dis.dis(f)
              0 SET_LINENO               1

              3 SET_LINENO               2
              6 BUILD_LIST               0
              9 DUP_TOP             
             10 LOAD_ATTR                0 (append)
             13 STORE_FAST               1 (_[1])
             16 LOAD_GLOBAL              2 (range)
             19 LOAD_FAST                0 (n)
             22 CALL_FUNCTION            1
             25 GET_ITER            

        >>   26 SET_LINENO               2
             29 FOR_ITER                16 (to 48)
             32 STORE_FAST               2 (i)
             35 LOAD_FAST                1 (_[1])
             38 LOAD_FAST                2 (i)
             41 CALL_FUNCTION            1
             44 POP_TOP             
             45 JUMP_ABSOLUTE           26
        >>   48 DELETE_FAST              1 (_[1])
             51 STORE_FAST               3 (l)

             54 SET_LINENO               3
             57 LOAD_GLOBAL              6 (locals)
             60 CALL_FUNCTION            0
             63 PRINT_ITEM          
             64 PRINT_NEWLINE       

             65 SET_LINENO               4
             68 LOAD_FAST                3 (l)
             71 RETURN_VALUE        
             72 LOAD_CONST               0 (None)
             75 RETURN_VALUE        

but you can't access it.  Nesting list comprehensions just increments the
number in the brackets.

-- 
Skip Montanaro (skip at pobox.com - http://www.mojam.com/)




More information about the Python-list mailing list