使用Python循环更改变量名

41 投票
5 回答
217804 浏览
提问于 2025-04-15 12:34

我只是想问问有没有人知道怎么在一个循环里根据情况来改变变量的名字,比如像这样:

for i in range(3)
     group+i=self.getGroup(selected, header+i)

这样变量的名字就能根据数据的不同而变化。谢谢!

~Sam

5 个回答

6

确实应该使用字典,像接受的解决方案中提到的那样,用 "group" + str(i) 作为键。不过我想分享一个使用 exec 的解决方案。exec 是一种将字符串解析成命令并动态执行的方式。这样可以根据你的需求创建这些标量变量名,而不是使用字典。这可能会帮助你了解什么是不应该做的,虽然你可以这样做,但并不意味着你应该这样做。只有在使用标量变量是硬性要求时,这才是一个好的解决方案:

l = locals()
for i in xrange(3):
    exec("group" + str(i) + "= self.getGroup(selected, header + i)")

这里还有一个例子,展示了如何在 Django 模型中使用这个方法。exec 的替代方案被注释掉了,而使用 dict 属性处理这种情况的方式更合理:

Class A(models.Model):

    ....

    def __getitem__(self, item):  # a.__getitem__('id')
        #exec("attrb = self." + item)
        #return attrb
        return self.__dict__[item]

从一开始就使用字典可能更有意义,这样可以获得 setattr 和 getattr 函数。

在涉及解析的情况下,比如动态生成和执行 Python 命令时,exec 是你想要的 :) 更多关于 exec 的信息可以在 这里找到。

11

用一个列表。

groups = [0]*3
for i in xrange(3):
    groups[i] = self.getGroup(selected, header + i)

或者更“符合Python风格”的做法:

groups = [self.getGroup(selected, header + i) for i in xrange(3)]

不过,你可以尝试用“错误”的方式来创建变量,也就是通过修改存储它们值的字典:

l = locals()
for i in xrange(3):
    l['group' + str(i)] = self.getGroup(selected, header + i)

但这样做其实很不规范,而且可能还不一定能成功。

70

你可能想用字典来代替单独的变量。例如:

d = {}
for i in range(3):
    d["group" + str(i)] = self.getGroup(selected, header+i)

如果你坚持要修改本地变量,可以使用 locals 函数:

for i in range(3):
    locals()["group"+str(i)] = self.getGroup(selected, header+i)

另一方面,如果你真正想要的是修改你所在类的实例变量,那么可以使用 setattr 函数。

for i in group(3):
    setattr(self, "group"+str(i), self.getGroup(selected, header+i)

当然,我在这些例子中假设你并不只是想要一个列表:

groups = [self.getGroup(i,header+i) for i in range(3)]

撰写回答