On Dec 8, 10:27 pm, John Machin <[EMAIL PROTECTED]> wrote: > On Dec 9, 3:00 pm, Steven D'Aprano > > > > <[EMAIL PROTECTED]> wrote: > > On Mon, 08 Dec 2008 19:10:00 -0800, Robert Dailey wrote: > > > On Dec 8, 6:26 pm, Terry Reedy <[EMAIL PROTECTED]> wrote: > > >> Robert Dailey wrote: > > >> > stuff = vars() > > > >> >>> vars() is globals() > > >> True > > > >> > for key in stuff: > > > >> You just changed globals, which is aliased as stuff. Stuff changes. > > > >> > print( key, '--', stuff[key] ) > > > >> > I get the following error message: > > >> > ('CopyEmotionFX', '--', <function CopyEmotionFX at 0x0205BF70>) > > >> > Traceback (most recent call last): > > >> > File "C:\IT\work\jewett\depends.py", line 12, in <module> > > >> > for key in stuff: > > >> > RuntimeError: dictionary changed size during iteration > > > >> > Why is this happening? > > > > How am I changing globals()? I'm simply iterating the keys in the dict. > > > Can someone explain what is going on please? > > > You create an new name "key": > > > for key in stuff > > > I suppose you could do this: > > > key = None > > stuff = vars() > > for key in stuff: > > but both 'key' and 'stuff' will appear in the dict, possibly causing > confusion; another reason why > > > even better would be: > > > for key in vars().copy(): > > > because that protects you from cases where globals() change inside the > > for loop. > >
When I do: for key in stuff.keys(): It works! I wonder why .keys() makes a difference. It is using a 'view', which is a new concept in Python 3.0 that I'm not totally familiar with yet. -- http://mail.python.org/mailman/listinfo/python-list