iterating initalizations

Steve Holden steve at holdenweb.com
Tue Dec 23 16:20:59 CET 2008


D'Arcy J.M. Cain wrote:
> On Mon, 22 Dec 2008 22:32:17 -0500
> Aaron Stepp <stepp.aaron at gmail.com> wrote:
>> Instead of writing a long list of initializations like so:
>>
>> A = [ ]
>> B = [ ]
>> ...
>> Y = [ ]
>> Z = [ ]
>>
>> I'd like to save space by more elegantly turning this into a loop.  If  
> 
> Well, if all you want is a loop:
> 
>     for v in vars:
>         locals()[v] = []
> 
Note that this isn't guaranteed to work. While locals() will return a
dict containing the names and values from the local namespace, you won't
affect the local namespace by assigning values to the appropriate keys:

>>> def f():
...   a = "hello"
...   locals()["a"] = "goodbye"
...   print a
...
>>> f()
hello
>>>

If you look at the function's code you will see that the local "a" is
accessed using the LOAD_FAST and STORE_FAST opcodes, which take
advantage of the knowledge that the name is local - the interpreter
analyzed the function body looking for assignments to non-globals, and
optimizes its treatment of such names.

>>> dis.dis(f)
  2           0 LOAD_CONST               1 ('hello')
              3 STORE_FAST               0 (a)

  3           6 LOAD_CONST               2 ('goodbye')
              9 LOAD_GLOBAL              0 (locals)
             12 CALL_FUNCTION            0
             15 LOAD_CONST               3 ('a')
             18 STORE_SUBSCR

  4          19 LOAD_FAST                0 (a)
             22 PRINT_ITEM
             23 PRINT_NEWLINE
             24 LOAD_CONST               0 (None)
             27 RETURN_VALUE
>>>

> It's hard to tell if that's what you actually need though without
> deeper analysis of your requirements.
> 
I think it's unlikely that the OP really does need to create names
dynamically, and should look at using either a dict indexed by the
letters of self.__abet, or a list indexed from 0 to 24 instead. But you
*are* correct about the need for a little more information ;-)

regards
 Steve


-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list