Martin Manns wrote:
After being confused I figured out it is a 3.x example:

Actually, it is a compatibility example between 2.x and 3.x, compare below for different behavior from two seemingly identical compatible constructs, one from 3.2, and the other from 2.6.4:


Python 3.2 (r32:88445, Mar 29 2011, 21:33:57)
[GCC 4.3.3] on linux2

fs=[]
fs = [(lambda n: i + n) for i in range(10)]
[fs[i](1) for i in range(10)]
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]       <=========== compare



Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2

fs=[]
fs = [(lambda n: i + n) for i in range(10)]
[fs[i](1) for i in range(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]               <=========== compare



Having compared the two, someone please tell me whether the two are incompatible, mostly compatible, completely incompatible, or different languages...


,.,, I realize how 3.2 is working (at the moment) but as compared with the books, and the behavior of 2.6, it sure looks 'broke' to me...

... why would we want to defer lookup of the 'i' in range(10) until the anonymous function is called, instead of the time that the function object is returned... inquiring minds want to know...


PS  Ian calls the second construct "working by mistake..."







kind regards,
m harris




--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to