iterating initalizations
Steve Holden
steve at holdenweb.com
Tue Dec 23 10:20:59 EST 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