--- On Sun, 4/25/10, Chris Rebert <c...@rebertia.com> wrote: > From: Chris Rebert <c...@rebertia.com> > Subject: Re: NameError: how to get the name? > To: "Yingjie Lan" <lany...@yahoo.com> > Cc: python-list@python.org > Date: Sunday, April 25, 2010, 3:27 AM > On Sat, Apr 24, 2010 at 4:17 PM, > Yingjie Lan <lany...@yahoo.com> > wrote: > > --- On Sat, 4/24/10, Gary Herron <gher...@islandtraining.com> > wrote: > >> From: Gary Herron <gher...@islandtraining.com> > >> Date: Saturday, April 24, 2010, 8:03 PM > >> Yingjie Lan wrote: > >> > --- On Sat, 4/24/10, Steven D'Aprano > >> > <st...@remove-this-cybersource.com.au> > >> wrote: > >> >> From: Steven D'Aprano <st...@remove-this-cybersource.com.au> > >> >> Subject: Re: NameError: how to get the > name? > >> >> To: python-list@python.org > >> >> Date: Saturday, April 24, 2010, 4:07 PM > >> >> On Sat, 24 Apr 2010 04:19:43 -0700, > >> >> Yingjie Lan wrote: > >> >> > >> >> > >> >>> I wanted to do something like this: > >> >>> > >> >>> while True: > >> >>> try: > >> >>> def fun(a, b=b, c=c): > >> pass > >> >>> except NameError as ne: > >> >>> name = > >> get_the_var_name(ne) > >> >>> locals()[name] = '' > >> >>> else: break > >> >>> > >> >> This won't work. Writing to locals() does > not > >> actually > >> >> change the local variables. Try it inside > a > >> function, and you will see it > >> >> doesn't work: > > > > No it DOESN'T work, and both of you are precisely > correct. > > Just for playing around, I substituted > > "locals()" by "globals()" and it worked as desired: > <snip> > > Thanks for the information! BTW, why would > > locals() and globals() differ in this respect? > > The module-level (i.e. global) namespace is implemented by > CPython > using an actual dictionary; globals() returns a proxy to > that > dictionary and lets you manipulate it. > In contrast, as an optimization, CPython implements local > variables in > functions using predetermined offsets into an array of > predetermined > length; the dictionary returned by locals() is dynamically > constructed > on-demand and does not affect the actual array used for the > local > variables (I suppose it could have been made to do so, but > there's > probably a complexity or optimization reason for why not). >
Thanks, that's good to know. The locals() behaves rather strangely, as can be demonstrated by the following two tests (the first one is from Steven, thanks Steve): #file: fun.py: def test(): x = 1 print (x) locals()['x'] = 2 print (x, locals()['x']) def test2(): locals()['x'] = 2 print (locals()['x']) print x test() test2() -----And the output: python fun.py------- 1 (1, 1) 2 Traceback (most recent call last): File "fun.py", line 21, in <module> test2() File "fun.py", line 17, in test2 print x NameError: global name 'x' is not defined ------------- I don't know how to make sense out of it. Any suggestions? Yingjie -- http://mail.python.org/mailman/listinfo/python-list