On Jul 14, 8:43 am, Steven D'Aprano <steve +comp.lang.pyt...@pearwood.info> wrote: > On Fri, 13 Jul 2012 19:31:24 -0700, rusi wrote: > > Consider the following > > > def foo(x): > > i = 100 > > if x: > > j = [i for i in range(10)] > > return i > > else: > > return i > > A simpler example: > > def foo(): > i = 100 > j = [i for i in range(10)] > return i > > In Python 3, foo() returns 100; in Python 2, it returns 9.
You did not get the point. Converting my example to your format: def foo_steven(n): i = 100 j = [i for i in range(n)] return i $ python3 Python 3.2.3 (default, Jun 26 2012, 00:38:09) [GCC 4.7.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def foo_steven(n): ... i = 100 ... j = [i for i in range(n)] ... return i ... >>> foo_steven(0) 100 >>> foo_steven(4) 100 >>> $ python Python 2.7.3rc2 (default, Apr 22 2012, 22:35:38) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def foo_steven(n): ... i = 100 ... j = [i for i in range(n)] ... return i ... >>> foo_steven(0) 100 >>> foo_steven(3) 2 >>> Python 2: When n>0 comprehension scope i is returned When n=0 function scope i is returned Python 3: The return statement is lexically outside the comprehension and so that outside-scope's i is returned in all cases. -- http://mail.python.org/mailman/listinfo/python-list