如何创建list的子类map2d以实现指定大小的二维数组初始化?
如何创建list子类map2d,初始化生成指定大小的二维数组?
你遇到的问题在于直接在__init__方法中给self赋值——这并不会修改当前的list实例,只是在方法内部重新绑定了self这个局部变量,原来的空list实例并没有被改变。
正确的实现方式
我们可以利用父类list的初始化逻辑,直接将生成的二维数组传递给父类的__init__方法,这样就能把二维数组的内容注入到当前的map2d实例中:
class map2d(list): def __init__(self, x, y): # 调用父类list的初始化方法,传入生成的二维数组 super().__init__([[None for _ in range(y)] for _ in range(x)])
测试一下:
Map = map2d(3,2) print(Map) # 输出:[[None, None], [None, None], [None, None]]
为什么你的代码不生效?
当你创建map2d(3,2)时,Python的执行流程是:
- 先调用
map2d.__new__创建一个空的list实例; - 把这个实例传给
__init__的self参数; - 你在
__init__中执行self = [[None...]],只是让self这个局部变量指向了一个新的列表对象,但原来的空list实例并没有被修改; - 所以最终打印的还是那个空的初始实例。
额外注意点
不要用[[None]*y]*x来生成二维数组——这种方式会让所有行都引用同一个列表对象,修改其中一行的元素会影响所有行。比如:
bad_map = map2d(3,2) bad_map[0][0] = "test" print(bad_map) # 如果用[[None]*y]*x,会输出:[["test", None], ["test", None], ["test", None]]
而我们用列表推导式[[None for _ in range(y)] for _ in range(x)]生成的是每行独立的列表,不会出现这个问题。
内容的提问来源于stack exchange,提问作者John AZ1
相关产品推荐
相关产品推荐

