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

如何创建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的执行流程是:

  1. 先调用map2d.__new__创建一个空的list实例;
  2. 把这个实例传给__init__的self参数;
  3. 你在__init__中执行self = [[None...]],只是让self这个局部变量指向了一个新的列表对象,但原来的空list实例并没有被修改;
  4. 所以最终打印的还是那个空的初始实例。

额外注意点

不要用[[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:58