Prev: psycopg2 / psycopg2.ProgrammingError: syntax error at or near "E'mytable'"
Next: Question on templates and python logging
From: Alain Ketterlin on 3 Apr 2010 06:30 Hi all, I've just spent a few hours debugging code similar to this: d = dict() for r in [1,2,3]: d[r] = [r for r in [4,5,6]] print d THe problem is that the "r" in d[r] somehow captures the value of the "r" in the list comprehension, and somehow kills the loop interator. The (unexpected) result is {6: [4, 5, 6]}. Changing r to s inside the list leads to the correct (imo) result. Is this expected? Is this a known problem? Is it solved in newer versions? This is python 2.6.4, on a stock ubuntu 9.10 x86-64 linux box. Let me know if more detail is needed. Thanks in advance. -- Alain.
From: Chris Rebert on 3 Apr 2010 06:53 On Sat, Apr 3, 2010 at 3:30 AM, Alain Ketterlin <alain(a)dpt-info.u-strasbg.fr> wrote: > I've just spent a few hours debugging code similar to this: > > d = dict() > for r in [1,2,3]: > Â Â d[r] = [r for r in [4,5,6]] > print d > > THe problem is that the "r" in d[r] somehow captures the value of the > "r" in the list comprehension, and somehow kills the loop interator. The > (unexpected) result is {6: [4, 5, 6]}. Changing r to s inside the list > leads to the correct (imo) result. > > Is this expected? Is this a known problem? Is it solved in newer > versions? Quoting http://docs.python.org/reference/expressions.html#id19 : Footnotes [1] In Python 2.3 and later releases, a list comprehension âleaksâ the control variables of each 'for' it contains into the containing scope. However, this behavior is deprecated, and relying on it will not work in Python 3.0 Cheers, Chris -- http://blog.rebertia.com
From: Steven D'Aprano on 3 Apr 2010 08:43 On Sat, 03 Apr 2010 12:30:32 +0200, Alain Ketterlin wrote: > Hi all, > > I've just spent a few hours debugging code similar to this: > > d = dict() > for r in [1,2,3]: > d[r] = [r for r in [4,5,6]] > print d This isn't directly relevant to your problem, but why use a list comprehension in the first place? [r for r in [4,5,6]] is just [4,5,6], only slower. I presume that is just a stand-in for a more useful list comp, but I mention it because I have seen people do exactly that, in real code, without knowing any better. (I may have even done so myself, once or twice.) > THe problem is that the "r" in d[r] somehow captures the value of the > "r" in the list comprehension, and somehow kills the loop interator. The > (unexpected) result is {6: [4, 5, 6]}. Actually, no it doesn't kill the loop at all. You have misinterpreted what you have seen: >>> d = dict() >>> for r in [1,2,3]: .... print r .... d[r] = [r for r in [4,5,6]] .... print d .... 1 {6: [4, 5, 6]} 2 {6: [4, 5, 6]} 3 {6: [4, 5, 6]} > Changing r to s inside the list > leads to the correct (imo) result. > > Is this expected? Is this a known problem? Is it solved in newer > versions? Yes, yes and yes. It is expected, because list comprehensions leak the variable into the enclosing scope. Yes, it is a problem, as you have found, although frankly it is easy enough to make sure your list comp variable has a unique name. And yes, it is fixed in Python 3.1. -- Steven
From: Tim Roberts on 4 Apr 2010 00:58 Alain Ketterlin <alain(a)dpt-info.u-strasbg.fr> wrote: > >I've just spent a few hours debugging code similar to this: > >d = dict() >for r in [1,2,3]: > d[r] = [r for r in [4,5,6]] >print d Yes, this has been fixed in later revisions, but I'm curious to know what led you to believe that a list comprehension created a new scope. I don't that was ever promised. -- Tim Roberts, timr(a)probo.com Providenza & Boekelheide, Inc.
From: Steve Howell on 4 Apr 2010 02:30 On Apr 3, 9:58 pm, Tim Roberts <t...(a)probo.com> wrote: > Alain Ketterlin <al...(a)dpt-info.u-strasbg.fr> wrote: > > >I've just spent a few hours debugging code similar to this: > > >d = dict() > >for r in [1,2,3]: > > d[r] = [r for r in [4,5,6]] > >print d > > Yes, this has been fixed in later revisions, but I'm curious to know what > led you to believe that a list comprehension created a new scope. I don't > that was ever promised. Common sense about how programming languages should work? As confirmed by later revisions?
|
Next
|
Last
Pages: 1 2 3 4 5 6 7 Prev: psycopg2 / psycopg2.ProgrammingError: syntax error at or near "E'mytable'" Next: Question on templates and python logging |