locals().update(...)

Discussion in 'Python' started by eisoab@gmail.com, Jul 4, 2012.

  1. Guest

    I expected this to work:


    def f(**args):
    locals().update(args)
    print locals()
    print a

    d=dict(a=1)

    f(**d)

    but:
    > global name 'a' is not defined



    Where is my mistake?

    This does work:

    globals().update({'a':1})

    print a

    1

    -E
    , Jul 4, 2012
    #1
    1. Advertising

  2. Dave Angel Guest

    On 07/04/2012 07:56 AM, wrote:
    > I expected this to work:
    >
    >
    > def f(**args):
    > locals().update(args)
    > print locals()
    > print a
    >
    > d=dict(a=1)
    >
    > f(**d)
    >
    > but:
    >> global name 'a' is not defined

    > Where is my mistake?


    Chris has given you the place where it's documented that it generally
    won't work. I'll try to explain why, at least for local variables
    inside functions, and for CPython implementation.

    The generated byte code for a function does *not* look up each symbol by
    name during execution. The compiler builds a list of known local
    symbol names, and gives them each an index (a small positive integer).
    At run time that list is fixed in size and meaning; no new locals can
    be added. The locals() function just creates a dictionary that
    approximates what the semantics of the symbols are. But changes to that
    dictionary have no effect on the running function.

    That's one reason that copying a global value to a local symbol inside a
    function can make that function run faster. Globals always require a
    dictionary lookup, while function locals are just an integer offset away.


    > This does work:
    >
    > globals().update({'a':1})
    >
    > print a
    >
    > 1
    >
    > -E
    >


    As i said above, the rules are different for globals, and they are even
    if you use locals() to access them. However, i'd consider it prudent
    never to assume you can write to the dictionary constructed by either
    the locals() or the globals() functions.

    --

    DaveA
    Dave Angel, Jul 4, 2012
    #2
    1. Advertising

  3. On Wed, 04 Jul 2012 18:48:08 -0400, Dave Angel wrote:

    > As i said above, the rules are different for globals, and they are even
    > if you use locals() to access them. However, i'd consider it prudent
    > never to assume you can write to the dictionary constructed by either
    > the locals() or the globals() functions.


    globals() is implicitly documented as being writable: "This is always the
    dictionary of the current module..." -- unless you have a module with a
    read-only dict, that is writable.

    http://docs.python.org/release/3.2/library/functions.html#globals

    There are tricks to getting read-only namespaces, but you can
    legitimately expect to write to globals().


    --
    Steven
    Steven D'Aprano, Jul 4, 2012
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Aaron Ackerman
    Replies:
    5
    Views:
    405
    Chris Dunaway
    Oct 13, 2003
  2. dgk
    Replies:
    2
    Views:
    398
  3. Giles Brown

    Question about "exec in globals, locals"

    Giles Brown, Jul 4, 2003, in forum: Python
    Replies:
    2
    Views:
    341
    Adrien Di Mascio
    Jul 4, 2003
  4. Paul Paterson

    How safe is modifying locals()?

    Paul Paterson, Jul 25, 2003, in forum: Python
    Replies:
    15
    Views:
    481
    Corey Coughlin
    Jul 28, 2003
  5. tedsuzman
    Replies:
    2
    Views:
    7,055
    Michel Claveau, résurectionné d'outre-bombe inform
    Jul 21, 2004
Loading...

Share This Page