"gangesmaster" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] | 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 -- http://mail.python.org/mailman/listinfo/python-list