如何在PyGame循环中为pygame.draw.rect创建动态命名变量?
在Pygame循环中存储带序号的矩形对象
不推荐使用动态命名变量的原因
- 动态创建的变量会污染命名空间,容易和现有变量重名,引发难以排查的bug
- 后续访问、遍历这些变量非常麻烦,无法直接批量操作
- 不符合Python编码规范,代码可读性和可维护性极差
推荐方案:使用列表或字典存储
方案1:列表存储(最常用)
把每个矩形对象存入列表,通过索引对应创建序号(索引从0开始,对应你的tset值-1,索引+1就是tset的序号)。
修改你的代码如下:
def invRect(self): # 初始化列表,若需要保留之前的矩形可移除这行,移到类的__init__方法中 self.rects = [] tset = 0 for x in range(self.rows): for i in range(self.columns): tset += 1 # 先获取矩形对象 rect = pygame.draw.rect( screen, self.color, (self.pos[0] + self.scale * i, self.pos[1] + self.scale * x, self.scale, self.scale) ) # 将矩形添加到列表 self.rects.append(rect) # 示例访问:第1个矩形对应self.rects[0],第tset个对应self.rects[tset-1] # 遍历所有矩形: # for idx, rect in enumerate(self.rects): # print(f"rect_{idx+1}: {rect}")
方案2:字典存储(带显式序号键)
如果一定要用rect_1、rect_2这种命名作为标识,可以用字典,键为序号字符串,值为矩形对象:
def invRect(self): self.rect_dict = {} tset = 0 for x in range(self.rows): for i in range(self.columns): tset += 1 rect = pygame.draw.rect( screen, self.color, (self.pos[0] + self.scale * i, self.pos[1] + self.scale * x, self.scale, self.scale) ) # 用f-string生成键名 self.rect_dict[f"rect_{tset}"] = rect # 示例访问:第1个矩形对应self.rect_dict["rect_1"] # 遍历所有矩形: # for key, rect in self.rect_dict.items(): # print(f"{key}: {rect}")
(不推荐)动态创建变量的方式
如果非要尝试动态命名变量,可通过globals()或setattr()实现,但强烈不建议:
def invRect(self): tset = 0 for x in range(self.rows): for i in range(self.columns): tset += 1 rect = pygame.draw.rect( screen, self.color, (self.pos[0] + self.scale * i, self.pos[1] + self.scale * x, self.scale, self.scale) ) # 全局命名空间创建变量 globals()[f"rect_{tset}"] = rect # 若要创建实例属性(推荐用字典代替) # setattr(self, f"rect_{tset}", rect)
注意:用
setattr创建的实例属性可以通过self.rect_1访问,但依然不如字典或列表便于批量操作。
内容的提问来源于stack exchange,提问作者Alex GkG
相关产品推荐
相关产品推荐

