Python报'str' object has no attribute 'append'错 二维矩阵转列表异常
Python二维数组转一维列表报错排查与实现
报错根因
触发'str' object has no attribute 'append'错误的原因非常直接:
- 初始化
new_arr时执行的new_arr = ['0']*total_elements,生成的列表每个位置的元素都是字符串类型的'0',根本不是列表对象 - 后续代码在
new_arr[rows*i + j]这个字符串元素上调用了仅列表支持的append方法,自然会触发“对象不存在该属性”的报错
除此之外,当前实现的逻辑本身存在冗余:你的需求是把二维矩阵顺序展平为一维列表,完全不需要提前计算总长度、预生成定长占位元素再逐位置赋值。
修正实现
贴合原有循环逻辑的修复版
把原代码中类型不匹配的初始化逻辑替换为空列表,直接在遍历过程中追加元素即可:
def two_d_translate(arr): if not arr: return [] rows = len(arr) cols = len(arr[0]) new_arr = [] for i in range(rows): for j in range(cols): new_arr.append(arr[i][j]) return new_arr
修复逻辑说明:
- 去掉了无意义的定长占位初始化,从根源上避免字符串对象调用列表方法的类型错误
- 删除了冗余的
rows*i + j索引计算,直接按遍历顺序追加元素,匹配二维数组按行展平的常规输出规则
简洁实现方案
如果不需要手动写两层循环,可以直接用Python原生语法完成展平:
- 列表推导式版本(无额外依赖):
def two_d_translate(arr): return [item for row in arr for item in row]
- 标准库迭代工具版本:
from itertools import chain def two_d_translate(arr): return list(chain.from_iterable(arr))
同类场景踩坑提示
- 不要用
[空列表] * 长度的方式初始化嵌套列表,这种浅拷贝写法会让列表内所有子元素指向同一个内存对象,修改任意一个位置的元素,其他位置会同步变化。比如执行a = [[]]*3; a[0].append(1),最终会得到[[1], [1], [1]],完全不符合预期。正确的嵌套定长初始化写法是a = [[] for _ in range(3)] - 一维列表展平操作不需要提前计算总长度做预占位,直接顺序追加元素的实现可读性更高,也能降低类型不匹配的出错概率
内容的提问来源于stack exchange,提问作者Filip Mema
相关产品推荐
相关产品推荐

