Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!us.feeder.erje.net!newsfeed.fsmpi.rwth-aachen.de!news-1.dfn.de!news.dfn.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Gregory Ewing Newsgroups: comp.lang.python Subject: Re: PyEval_GetLocals and unreferenced variables Date: Thu, 04 Dec 2014 01:28:19 +1300 Lines: 48 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net hvWaZuU4y1K9ZfHgzkmMjg+9HMp0GjBvp5Yu/sNdAGIMdRIwl1 Cancel-Lock: sha1:U/Q/zK4ZeJXg87U2230vkt256sA= User-Agent: Mozilla Thunderbird 1.0.5 (Macintosh/20050711) X-Accept-Language: en-us, en In-Reply-To: Xref: csiph.com comp.lang.python:81859 Kasper Peeters wrote: > That may have been the design plan, but in Python 2.7.6, I definitely > am able to inject locals via PyEval_GetLocals() and have them be visible > both from the C and Python side; What seems to be happening is that the dict created by PyEval_GetLocals() is kept around, so you can change it and have the changes be visible through locals() in Python. However, that doesn't create a local *name* that's visible from Python. Or if the local name exists, changes made through locals() aren't reflected in the value of the local name. Existing local name is not changed: >>> def f(): ... a = 42 ... locals()['a'] = 17 ... print a ... >>> f() 42 Can't create a local name: >>> def g(): ... locals()['a'] = 17 ... print a ... >>> g() Traceback (most recent call last): File "", line 1, in File "", line 3, in g NameError: global name 'a' is not defined Changes to locals() persist: >>> def h(): ... locals()['a'] = 17 ... print locals()['a'] ... >>> h() 17 -- Greg