如何构造包含唯一对象的二维数组?Python列表推导式问题排查
问题与解决:创建包含独立Cell对象的二维数组
问题场景
平时创建指定大小的二维数组常用写法:
array = [[x] * a for b in range(size)]
其中:
x:数组元素a:数组宽度size:数组高度
但尝试用类似写法创建存储自定义Cell对象的正方形二维数组时:
gameboard = [[Cell(screen_size, size)] * size for size in range(size)]
出现异常:当size=5时,本该生成25个独立的Cell对象,实际却只有5个唯一对象,每行的元素都是对应第一行元素的引用,每个对象被重复引用5次。
问题原因
[Cell(screen_size, size)] * size的写法中,* size是将同一个Cell实例的引用复制了size次。因为Cell是自定义类的实例(可变对象),Python对可变对象的复制操作只会复制引用,不会创建新的对象。外层的for循环虽然生成了多行,但每行内部的元素都是同一个对象的引用。
解决方案
把内层的*复制替换为列表推导式,确保每个位置都创建新的Cell实例:
gameboard = [[Cell(screen_size, size) for _ in range(size)] for _ in range(size)]
这里用_作为循环变量(表示该变量在循环中未被使用),内层推导式会为每个元素调用一次Cell()构造方法,生成全新的实例,最终得到的二维数组中每个Cell都是独立的对象。
补充说明
如果数组元素是不可变对象(如整数、字符串、元组),用*复制是安全的;但如果是可变对象(如自定义类实例、列表、字典),必须通过列表推导式或循环逐个创建新对象,避免出现引用重复的问题。
内容的提问来源于stack exchange,提问作者Christian Badcoe
相关产品推荐
相关产品推荐

