[EMAIL PROTECTED] wrote: > if __name__ == '__main__': > > print "Globals (For Loop):" > try: > for i in globals(): > print "\t%s" % i > except RuntimeError: > print "Only some globals() printed\n" > else: > print "All globals() printed\n" > > print "Globals (Generator):" > try: > print "\n".join("\t%s" % i for i in globals()) > except RuntimeError: > print "Only some globals() printed\n" > else: > print "All globals() printed\n" > >>>> Globals (For Loop): >>>> __builtins__ >>>> Only some globals() printed >>>> >>>> Globals (Generator): >>>> __builtins__ >>>> __name__ >>>> __file__ >>>> i >>>> __doc__ >>>> All globals() printed >>>> > > Why is it with a generator I get everything out but with a for loop I > don't? I know that globals is not read-only but I would of expected > the same behaviour from both...
Run the for loop in the interpreter, without catching exceptions. You get __builtins__ Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration Then `print globals()` shows that i has been added to the global namespace. If you run the for loop a second time, after i exists, the loop runs fine. Apparently, generator comprehensions have been optimized so that they don't expose their working variables. The generator comprehension won't add i to the global namespace, so all is well. Mel. -- http://mail.python.org/mailman/listinfo/python-list