Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!feeder.erje.net!newsfeed.xs4all.nl!newsfeed5.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; '(although': 0.05; '*not*': 0.05; 'cpython': 0.05; 'exec': 0.07; 'python': 0.08; 'dict': 0.09; 'executes': 0.09; 'from:addr:ethan': 0.09; 'from:addr:stoneleaf.us': 0.09; 'from:name:ethan furman': 0.09; 'it;': 0.09; 'match.': 0.09; 'message-id:@stoneleaf.us': 0.09; 'received:gator410.hostgator.com': 0.09; 'variables.': 0.09; '~ethan~': 0.09; 'def': 0.13; "hasn't": 0.13; 'compiler,': 0.16; 'dictionary,': 0.16; 'frame,': 0.16; 'received:72.11': 0.16; 'received:72.11.125': 0.16; 'received:72.11.125.166': 0.16; 'sync': 0.16; 'wrote:': 0.16; 'subject:Question': 0.19; 'cc:no real name:2**0': 0.21; '(or': 0.22; "doesn't": 0.22; 'header:In- Reply-To:1': 0.22; 'figure': 0.23; 'assigning': 0.23; 'fine': 0.24; 'stack': 0.24; 'cc:2**0': 0.25; 'function': 0.27; 'variable': 0.27; 'problem': 0.29; 'print': 0.29; 'kelly': 0.30; 'operation.': 0.30; 'actually': 0.32; 'does': 0.32; 'actual': 0.32; "can't": 0.32; 'header:User-Agent:1': 0.33; 'to:addr:python- list': 0.33; 'setting': 0.34; 'probably': 0.35; '...': 0.35; 'uses': 0.36; 'but': 0.37; 'happens': 0.37; 'should': 0.38; 'subject:: ': 0.39; 'change': 0.40; 'to:addr:python.org': 0.40; 'course,': 0.61; 'received:websitewelcome.com': 0.64; 'believe': 0.65; 'received:184': 0.67; 'subject:name': 0.67; 'hand,': 0.76; 'compiles': 0.84; 'locals': 0.84; 'received:gateway04.websitewelcome.com': 0.91 Date: Wed, 01 Feb 2012 15:08:24 -0800 From: Ethan Furman User-Agent: Thunderbird 1.5.0.10 (Windows/20070221) MIME-Version: 1.0 To: python-list@python.org Subject: Re: Question about name scope References: <20120201181117.5d35dddc@bigfoot.com> <4F29BB9C.70405@stoneleaf.us> In-Reply-To: <4F29BB9C.70405@stoneleaf.us> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator410.hostgator.com X-AntiAbuse: Original Domain - python.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - stoneleaf.us X-BWhitelist: no X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: mail.admailinc.com ([192.168.10.136]) [72.11.125.166]:2566 X-Source-Auth: ethan+stoneleaf.us X-Email-Count: 2 X-Source-Cap: dG9idWs7dG9idWs7Z2F0b3I0MTAuaG9zdGdhdG9yLmNvbQ== Cc: mwilson@the-wire.com X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 33 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1328139369 news.xs4all.nl 6885 [2001:888:2000:d::a6]:33826 X-Complaints-To: abuse@xs4all.nl Xref: x330-a1.tempe.blueboxinc.net comp.lang.python:19751 Ethan Furman wrote: > Ian Kelly wrote: >> I am not a dev, but I believe it works because assigning to locals() >> and assigning via exec are not the same thing. The problem with >> assigning to locals() is that you're fundamentally just setting a >> value in a dictionary, and even though it happens to be the locals >> dict for the stack frame, Python can't figure out that it should go >> and update the value of the optimized local to match. exec, on the >> other hand, compiles and executes an actual STORE_NAME operation. Of >> course, if the particular local variable hasn't been optimized by the >> compiler, then updating locals() works just fine (although you >> probably should not rely on this): >> >>>>> def f(x, y): >> ... locals()[x] = y >> ... print locals()[x] >> ... exec 'print ' + x >> ... >>>>> f('a', 42) >> 42 >> 42 > > Definitely should rely on it, because in CPython 3 exec does not > un-optimize the function and assigning to locals() will not actually > change the functions variables. Ouch, that should have been *not* rely on it; not because it doesn't work (exec uses locals() if one is not specified), but because it is easy for the names in the function to get out of sync with the names in the functions locals() (or __dict__). ~Ethan~