2015-10-01 2 views
-3

У меня есть сотни переменных (здесь их мало, поэтому вы получите представление о том, как работает этот код), и я не знаю, как решить эту проблему. То, что я хочу сделать, - это включить второй оператор, чтобы каким-то образом изменить переменную, прежде чем объявлять ее, чтобы я мог скопировать класс в нее, чтобы я мог обойти многие ненужные, если бы слова. Является ли это возможным?Можете ли вы изменить переменную перед ее объявлением?

Этот код в секунду, если заявление, конечно, неправильно

globals()["p%sg%sr01_id" % (cp, awsg)]) = copy.copy(temp1) 

, но это то, что я хотел бы достичь, прежде чем объявить переменную, в которой я буду копировать класс

import copy 
cp = "01" 
awsg = "01" 
temp1 = 0 
temp2 = 0 

first_hovered_variable = "01" 
second_hovered_variable = "02" 


class Char(): 
    def __init__(self, name): 
     self.n = name 

p01g01r01_id = Char("A1") 
p01g01r02_id = Char("B2") 
p01g01r03_id = Char("C3") 

reg01_id = Char("001") 
reg02_id = Char("002") 
reg03_id = Char("003") 


def swap_variables(): 
    global cp 
    global awsg 

    global temp1 
    global temp2 

    global first_hovered_variable 
    global second_hovered_variable 

    global reg01_id 
    global reg02_id 
    global reg03_id 

    global p01g01r01_id 
    global p01g01r02_id 
    global p01g01r03_id 

    if first_hovered_variable == second_hovered_variable: 
     first_hovered_variable = 0 
     second_hovered_variable = 0 

    elif first_hovered_variable != 0 and second_hovered_variable != 0: 
     temp1 = copy.copy(globals()["p%sg%sr%s_id" % (cp, awsg, second_hovered_variable)]) 
     temp2 = copy.copy(globals()["p%sg%sr%s_id" % (cp, awsg, first_hovered_variable)]) 

     if first_hovered_variable == "01": 
      reg01_id = copy.copy(temp1) 
      globals()["p%sg%sr01_id" % (cp, awsg)]) = copy.copy(temp1) 

     elif first_hovered_variable == "02": 
      reg02_id = copy.copy(temp1) 
      globals()["p%sg%sr02_id" % (cp, awsg)]) = copy.copy(temp1) 

     elif first_hovered_variable == "03": 
      reg03_id = copy.copy(temp1) 
      globals()["p%sg%sr03_id" % (cp, awsg)]) = copy.copy(temp1)  

     if second_hovered_variable == "01": 
      reg01_id = copy.copy(temp2) 
      globals()["p%sg%sr01_id" % (cp, awsg)]) = copy.copy(temp1)  

     elif second_hovered_variable == "02": 
      reg02_id = copy.copy(temp2) 
      globals()["p%sg%sr02_id" % (cp, awsg)]) = copy.copy(temp1) 

     elif second_hovered_variable == "03": 
      reg03_id = copy.copy(temp2) 
      globals()["p%sg%sr03_id" % (cp, awsg)]) = copy.copy(temp1) 

    temp1 = 0 
    temp2 = 0 

swap_variables() 
print p01g01r01_id.n 
print p01g01r02_id.n 
print p01g01r03_id.n 

print reg01_id.n 
print reg02_id.n 
print reg03_id.n 
+0

Возможный дубликат [Название динамической переменной в python] (http://stackoverflow.com/questions/2564140/dynamic-variable-name-in-python) –

+8

Ваш код является, совершенно откровенным, ужасным. У вас есть огромное количество повторений (немедленная санкция из отдела избыточности избыточности), множество «глобальных» переменных, бессмысленный класс, огромное количество повторений ... После того, как вы это сделаете, подумайте о посещении [codereview.se] для некоторой обратной связи. – jonrsharpe

+1

Попробуйте пойти * с * языком, а не * против * его. –

ответ

4

Да, вы можете установить новые глобальные переменные непосредственно в каталоге globals(), без каких-либо других назначений этим именам.

Однако вы должны рассмотреть возможность создания отдельного словаря или списка для своих экземпляров. Таким образом, вы можете адресовать эти экземпляры как группу.

Для ваших 3-х измерениях, можно даже создать вложенную структуру:

characters = [ 
    [ 
     [Char(letter + digit) for letter, digit in zip('ABC', '123')] 
     for g in range(3) 
    ] for p in range(3) 
] 

Сделайте то же самое для 3 reg переменных; сохраните их в списке.

Теперь вы можете позвонить characters[0][1][2], чтобы получить Char('C3') в этом положении. Храните эти индексы в переменных, и вы можете использовать те для решения различных позиций:

reg[first_hovered_variable] = characters[cp][awsg][first_hovered_variable] 

и вы удалили весь набор if заявлений.

+0

Спасибо за ответ. Я пытаюсь использовать ваш код, но я продолжаю получать: ValueError: слишком много значений для распаковки – Gunnm

+0

@Gunnm: мои извинения, я забыл включить вызов 'zip()'. –

+0

Благодарим вас за помощь. Оно работает. Я надеюсь, что больше людей здесь помогут другим, как вы. – Gunnm

Смежные вопросы