2012-11-28 21 views
13

Jak używać zmiennych do nazywania zmiennych? Na przykład, jeśli chciałbym mieć zmienną double_1 = 2, double_2 = 4 aż do double_12 = 24, jak mógłbym to napisać? Mam wrażenie, że będzie to coś takiego:Używanie pętli w języku Python do nadawania nazw zmiennym

for x in range(1, 13): 
    double_x = x * 2 
    #I want the x in double_x to count up, e.g double_1, double_2, double_3 

Oczywiście, to nie działa, ale co będzie poprawna składnia do realizacji szereg zapętlone do nazwy zmiennej? Nie kodowałem od jakiegoś czasu, ale pamiętam, że był sposób na zrobienie tego.

+1

dlaczego nie można używać tablic? – tuxuday

+3

użyj dykt. Właśnie dlatego zostały stworzone. –

Odpowiedz

32

Zamiast tego użyj słownika. Np:

doubles = dict() 

for x in range(1, 13): 
    doubles[x] = x * 2 

Lub jeśli absolutniekoniecznością zrobić AND ONLY IF YOU FULLY UNDERSTAND WHAT YOU ARE DOING, można przypisać do locals() jak do słownika:

>>> for x in range(1, 13): 
...  locals()['double_{0}'.format(x)] = x * 2 
... 
>>> double_3 
6 

Nie nigdy, przenigdy powinny być powód, aby to zrobić, jednak - ponieważ powinieneś być używając słownika zamiast!

+1

+1, ale "Lub jeśli absolutnie musisz to zrobić" prawdopodobnie nie, a zatem nie powinien nigdy. – phant0m

+0

przypisywanie do takich mieszkańców jest bardzo niebezpieczne. naprawdę należy tego unikać. powinieneś połączyć kilka informacji na ten temat lub ostrzejsze ostrzeżenie. –

+0

proszę link niektórych informacji, a ja link do niego :) – Kimvais

5

rozszerza mój komentarz: "użyć dict to jest dokładnie to, dlaczego zostały one stworzone."

użyciu defaultdict:

>>> from collections import defaultdict 
>>> d = defaultdict(int) 

użyciu normalnej dict:

>>> d = {} 

reszta:

>>> for x in range(1, 13): 
    d['double_%02d' % x] = x * 2 


>>> for key, value in sorted(d.items()): 
    print key, value 


double_01 2 
double_02 4 
double_03 6 
double_04 8 
double_05 10 
double_06 12 
double_07 14 
double_08 16 
double_09 18 
double_10 20 
double_11 22 
double_12 24 
+0

Dlaczego warto skorzystać z defaultdict? – phant0m

+0

bez konkretnego powodu, ale on chce ints, chyba nie potrzebujesz tej części naprawdę .. ale lubię je: P –

+3

;) Wolę mieć wyjątek, jeśli próbuję uzyskać dostęp do czegoś, co nie istnieje. – phant0m

1

Możesz użyć dyktatury, gdy nie spełnia Twoich wymagań. Ale mam nadzieję, że to ci pomoże.

var_dic = {} 
for x in range(1, 13): 
    var_dic["double_%s"% str(x)] = x * 2 
print var_dic 
1

Jak już wspomniano, należy użyć dyktowania. Oto prosty i łatwy sposób na stworzenie takiego, który spełnia Twoje wymagania.

>>> {k:k*2 for k in range(1,13)} 
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18, 10: 20, 11: 22, 12: 24} 
2

Chociaż wątpię, czego naprawdę potrzebujesz, aby robić to, co chcesz, oto sposób:

namespace = globals() 
for x in range(1, 13): 
    namespace['double_%d' % x] = x * 2 

print double_1 
print double_2 
    ... 
print double_12 

globals() zwraca słownika reprezentujący obecną globalną tablicę symboli (słownika bieżącego modułu). Jak widać, można dodawać do niego dowolne wpisy.

Powiązane problemy