Python3 DynamicArray切片方法返回数组大小错误问题排查
DynamicArray.slice 方法返回数组大小不符合预期问题修复
问题背景
需要实现DynamicArray类的slice方法:从原动态数组的指定start_index索引位置开始,截取共size个元素,返回包含这些截取元素的全新DynamicArray实例。当前编写的代码无法通过测试,报错提示返回的动态数组大小不符合预期,原有实现代码如下:
def slice(self, start_index: int, size: int) -> "DynamicArray": slice_array = DynamicArray() if(start_index < 0) or (start_index >= self._size): raise DynamicArrayException elif(size > self._size) or (size + start_index >= self._size) or (size < 0): raise DynamicArrayException #resize to fit the number of elements for i in range(start_index, size+start_index): slice_array.append(self._data[i]) return DynamicArray()
原有实现的设计逻辑:
- 先做参数合法性校验:
start_index小于0或大于等于原数组长度self._size时抛出DynamicArrayException;size小于0、大于原数组长度,或start_index + size超出原数组合法索引范围时同样抛出异常 - 校验通过后遍历
start_index到start_index + size区间的索引,将对应元素依次append到预先创建的slice_array实例中 - 原逻辑认为
size + start_index可以正确限定新数组的元素范围与大小,但实际运行结果不符合预期。
问题根因
- 核心错误:最后返回的是一个全新的空
DynamicArray()实例,而不是前面已经完成元素追加的slice_array变量,这直接导致返回的数组永远是空的,大小为0,和预期完全不符。 - 边界校验逻辑错误:判断
size + start_index >= self._size会误拦截合法场景。例如原数组长度为5、start_index=3、size=2时,合法截取索引为3、4,此时start_index + size = 5刚好等于数组长度,属于合法范围,但原有判断会错误抛出异常。另外冗余的size > self._size判断完全可以被start_index + size > self._size覆盖,不需要单独写。
修复后代码
def slice(self, start_index: int, size: int) -> "DynamicArray": slice_array = DynamicArray() # 参数合法性校验 if start_index < 0 or start_index >= self._size: raise DynamicArrayException if size < 0 or start_index + size > self._size: raise DynamicArrayException # 追加指定区间的元素 for i in range(start_index, start_index + size): slice_array.append(self._data[i]) # 返回填充完成的切片数组 return slice_array
修复点说明
- 修正返回值:将最后返回的空
DynamicArray()替换为已经完成元素填充的slice_array - 修正边界校验条件:将
size + start_index >= self._size改为start_index + size > self._size,移除冗余的size > self._size判断,避免合法场景被误拦截 - 移除条件判断中不必要的括号,符合Python编码规范
内容的提问来源于stack exchange,提问作者310ToPoona
相关产品推荐
相关产品推荐

