Python动态数组List的extend函数实现问题:输出嵌套列表不符合预期
问题分析与修复方案
你的extend函数出现嵌套列表的问题,核心原因有两点:
- 参数使用
*ArrObj导致传入的列表被打包成元组的单个元素,直接访问ArrObj[j]会拿到整个列表而非内部元素; - 嵌套循环逻辑错误,没有遍历目标列表的内部元素,反而把整个列表作为单个元素追加。
修复后的代码
方案1:和Python内置list.extend行为一致(接收单个可迭代对象)
# Writing logic for extend function def extend(self, iterable): # 遍历可迭代对象的每个元素,逐个追加 for item in iterable: self.append(item) return self.__str__()
方案2:支持传入多个可迭代对象(保持*可变参数)
如果需要同时扩展多个可迭代对象(比如my_list.extend(arr1, arr2, arr3)),可以修改为:
# Writing logic for extend function def extend(self, *iterables): # 遍历每个传入的可迭代对象 for iterable in iterables: # 遍历当前可迭代对象的元素并追加 for item in iterable: self.append(item) return self.__str__()
错误原因详解
- 原代码中
*ArrObj是可变参数,当你调用extend([89,99,67,78,101])时,ArrObj会被打包成元组([89,99,67,78,101],),长度为1; - 内层循环
ArrObj.__getitem__(j)拿到的是整个列表而非内部元素,执行append(item)就会把整个列表作为单个元素加入,形成嵌套结构; - 嵌套的
for循环逻辑冗余且错误,完全没必要按索引遍历,直接迭代可迭代对象的元素是更简洁且正确的方式; - 手动提前
__resize的代码可以去掉,因为append方法本身应该已经实现了自动扩容逻辑(当元素数量等于数组容量时触发扩容),提前指定扩容大小反而可能不符合动态数组的扩容策略(通常是翻倍扩容以保证分摊O(1)复杂度)。
内容的提问来源于stack exchange,提问作者SPACE GHOST
相关产品推荐
相关产品推荐

