Assert语句索引范围判断条件异常问题排查咨询
断言错误原因与修复
问题核心:断言逻辑完全写反了
Python的assert语句逻辑是:当条件表达式结果为False时,才会抛出AssertionError并显示错误信息;如果条件为True,程序会继续执行。
你现在的断言代码完全搞反了判断逻辑:
- 第一行
assert index>len(arr) , "index out of array range":你本来想检查“如果index超出数组范围(index>len(arr))就报错”,但实际效果是只要index≤len(arr)(也就是合法索引),条件就为False,直接触发断言错误——这就是为什么你用合法的非负索引4时,依然报错的原因(原数组长度是8,4≤8,条件index>len(arr)为False,触发错误)。 - 第二行
assert index<0 , "index can't be less than zero":同理,你想检查“index不能小于0”,但实际是只要index≥0(合法),条件就为False,触发错误。
修正后的断言代码
正确的写法应该是断言合法的索引范围(Python中允许索引等于数组长度,对应插入到数组末尾):
def Move(arr,target,index): # 检查索引是否小于0,或者大于数组长度(超出范围) assert index >= 0, "index can't be less than zero" assert index <= len(arr), "index out of array range" # 后续代码...
或者合并成一个断言:
assert 0 <= index <= len(arr), "index out of valid range"
额外的代码隐患
你的循环遍历arr的同时执行arr.pop(arr.index(val)),这种写法会导致遍历异常——因为修改原数组会破坏迭代器的遍历顺序,可能漏处理元素。比如原数组中的第二个0可能被跳过。
建议遍历原数组的副本,避免修改原数组影响遍历:
_list = [] # 遍历arr的副本,不影响原数组的遍历 for val in arr.copy(): if val == target: _list.append(target) arr.pop(arr.index(val))
修正后的完整代码
arr = [1,0,4,0,True,None,-12,"Jacob"] def Move(arr,target,index): assert 0 <= index <= len(arr), "index out of valid range" _list = [] for val in arr.copy(): if val == target: _list.append(target) arr.pop(arr.index(val)) for val in _list: arr.insert(index, val) return arr print(Move(arr,0,4)) # 输出:[1,4,True,None,0,0,-12,"Jacob"]
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

