You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:40:53