Python类中字典修改同索引全部元素而非单个的问题排查
问题分析与解决
问题根源
你遇到的核心问题是世界字典中的所有行共享了同一个列表对象的引用。大概率是你的CreateWorld方法用了类似下面的写法:
def CreateWorld(self): self.WorldDict = {} # 用*生成的列表是同一个对象的重复引用 row = [self.tile] * self.width for i in range(self.height): self.WorldDict[i] = row
这种方式下,字典里的每一行都指向同一个列表,所以修改任意一行的某个索引,所有行的对应位置都会同步变化——因为它们本质是同一个东西。
修复方案
修改CreateWorld方法,让每一行都是独立的新列表:
方式1:列表推导式(推荐,直观高效)
def CreateWorld(self): self.WorldDict = {} for y in range(self.height): # 每次循环生成全新的列表,避免引用复用 self.WorldDict[y] = [self.tile for _ in range(self.width)]
方式2:复制列表(兼容旧写法)
如果坚持用模板行,需要在赋值时创建副本:
def CreateWorld(self): self.WorldDict = {} row_template = [self.tile] * self.width for y in range(self.height): # 通过list()或.copy()生成新列表 self.WorldDict[y] = list(row_template) # 等价写法:self.WorldDict[y] = row_template.copy()
验证效果
修复后执行你的坐标修改代码:
coordinates = (1,3) MyWorld.WorldDict[coordinates[1]][coordinates[0]] = " P"
此时只会修改第3行(索引3)的第1列(索引1)位置,输出会符合你的预期:
- - - - - - - - - - - - - - - - - - - - - P - - -
内容的提问来源于stack exchange,提问作者Normal
相关产品推荐
相关产品推荐

