free variables /cell objects question

Terry Reedy tjreedy at udel.edu
Wed Jan 24 01:46:46 CET 2007


"gangesmaster" <tomerfiliba at gmail.com> wrote in message 
news:1169563580.634000.122540 at v45g2000cwv.googlegroups.com...
| so this is why [lambda: i for i in range(10)] will always return 9.

No, it returns a list of 10 identical functions which each return the 
current (when executed) global (module) variable i. Except for names, 
'lambda:i' abbreviates 'def f(): return i'.

>>> a=[lambda: i for i in range(10)]
>>> i=42
>>> for j in range(10): print a[j]()

42
42
42
42
42
42
42
42
42
42
>>> for i in range(10): print a[i]()

0
1
2
3
4
5
6
7
8
9
>>> del i
>>> for j in range(10): print a[j]()


Traceback (most recent call last):
  File "<pyshell#23>", line 1, in -toplevel-
    for j in range(10): print a[j]()
  File "<pyshell#8>", line 1, in <lambda>
    a=[lambda: i for i in range(10)]
NameError: global name 'i' is not defined

| imho that's a bug, not a feature.

The developers now think it a mistake to let the list comp variable 'leak' 
into the global scope.  It leads to the sort of confusion that you 
repeated.  In Py3, the leak will be plugged, so one will get an exception, 
as in the last example, unless i (or whatever) is defined outside the list 
comp.

Terry Jan Reedy






More information about the Python-list mailing list