Python普通for循环创建二维数组报错而列表推导式正常的原因
问题原因解释
第一段代码报错的核心逻辑
Python的列表属于动态可变容器,不会预先为未声明的索引分配空间,仅能对已经存在的索引位置执行赋值操作,不能直接给不存在的索引赋值。
你的第一段代码执行流程完全违反了这个规则:
- 初始化时
new = []是完全为空的列表,没有任何元素,此时访问new[i](哪怕i是0)都会直接触发索引越界错误,更不用说还要继续访问第二层的new[i][j]。 - 就算你提前给
new添加了3个空的子列表,内层子列表也依然是空的,直接执行new[i][j] = 0还是会因为内层子列表没有对应j的索引位置抛出越界错误。
如果要用普通for循环实现相同的二维数组创建效果,正确写法如下:
r = 3 c = 4 new = [] for i in range(r): # 先创建内层子列表,添加到外层列表 temp = [] for j in range(c): temp.append(0) new.append(temp) print(new)
输出结果和列表推导式完全一致。
第二段列表推导式可以正常执行的原因
双层列表推导式的执行逻辑是:
- 外层每循环一次,先生成一个长度为
c、所有元素都是0的内层列表 - 再把生成好的内层列表添加到外层列表中
全程不存在访问未创建索引的操作,所有元素都是先创建再加入对应容器,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Ayush Dwivedi
相关产品推荐
相关产品推荐

