你能在声明之前修改变量吗?

Can you modify variable before declaring it?

我有数百个变量(这里只列出其中的几个,因此您会了解这段代码的工作原理),但我不知道如何解决这个问题。我想要做的是在第二个 if 语句中以某种方式在声明它之前修改变量,这样我就可以将 class 复制到它,这样我就可以绕过许多不必要的 if 语句。可能吗?

第二个 if 语句中的这段代码当然是不正确的

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

但这是我在声明我将复制到的变量之前想要实现的 class

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

是的,您可以直接在 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')。将这些索引存储在变量中,您可以使用 those 来处理不同的位置:

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

并且您删除了一整套 if 语句。