A gotcha: Python pain point?

James Stroud jstroud at mbi.ucla.edu
Mon Jun 11 19:54:10 EDT 2007


Beorn wrote:
> Consider this example:
> 
>   >>> def funcs(x):
>   ...     for i in range(5):
>   ...         def g(): return x + i
>   ...         yield g
> 
> I would expect the value of x used in g to be that at the function
> declaration time, as if you've pass g a (x=x) argument, especially
> after reading this post: http://lua-users.org/wiki/LuaScopingDiscussion
> 
> But:
> 
>   >>> [ fun() for fun in list(funcs(1)) ]
>   [5, 5, 5, 5, 5]
> 
> Whereas:
> 
>   >>> [ fun() for fun in funcs(1) ]
>   [1, 2, 3, 4, 5]
> 
> This came up while discussing Python pain points at
> http://intertwingly.net/blog/2007/06/04/Python-Pain-Points#c1181602242
> 
> I can see how it works now, but I haven't found an easy-to-read
> documentation on this.
> 
> I guess it's debatable if perhaps every i used in the loop shouldn't
> be a different i.  It had me fooled, anyways.
> 
> Rgds,
> Bjorn
> 

If this isn't classified as a bug, then someone has some serious 
explaining to do. Why would it be desirable for a generator to behave 
differently in two different contexts. Should I import this to see how 
many principles this behavior violates?

James



More information about the Python-list mailing list