比较列表元素返回布尔值时触发TypeError: NoneType无__getitem__属性求助
TypeError: 'NoneType' object has no attribute 'getitem' 排查与解决
这个错误的核心是**day_shifts或night_shifts其中一个参数是None**,导致无法执行索引操作[day]。你提到打印判断条件时结果正常,但return时报错,大概率是以下几种情况:
可能的原因
- 测试场景与报错场景不一致:你手动测试时传入的都是有效列表,但实际运行时,某些分支下
day_shifts或night_shifts被赋值为None后传入了函数。 - 打印逻辑有误:你打印的是其他变量的判断结果,而非当前函数内
day_shifts[day] == night_shifts[day]的结果。 - 极端异步场景:多线程/多进程环境下,参数被其他线程异步修改为
None(这种情况很少见)。
解决步骤
- 添加参数校验:在函数开头加入断言,快速定位问题参数:
def check_cond_2(day_shifts, night_shifts, day): # 校验参数是否为None assert day_shifts is not None, "day_shifts 参数不能为 None" assert night_shifts is not None, "night_shifts 参数不能为 None" # 校验索引是否越界(避免后续可能的IndexError) assert 0 <= day < len(day_shifts), f"day={day} 超出 day_shifts 的索引范围" assert 0 <= day < len(night_shifts), f"day={day} 超出 night_shifts 的索引范围" result = day_shifts[day] == night_shifts[day] print(result) return result
运行后如果触发断言,会直接告诉你哪个参数出了问题。
检查函数调用处:遍历所有调用
check_cond_2的代码,确认传入的day_shifts和night_shifts是否始终是有效的列表:- 是否有分支逻辑中,列表生成失败返回了
None? - 是否在循环迭代时,某次循环的参数被意外重置为
None?
- 是否有分支逻辑中,列表生成失败返回了
确认打印逻辑:确保你添加的打印语句确实是打印当前函数内的判断结果,比如:
print(f"当前判断结果: {day_shifts[day] == night_shifts[day]}")
而非打印其他上下文的变量值。
补充说明
如果添加断言后,依然出现打印正常但return报错的情况,那就要考虑是否有异步代码在修改这两个列表变量。这种情况下,需要给变量加锁或者确保在函数调用期间参数不会被修改。
内容的提问来源于stack exchange,提问作者js079
相关产品推荐
相关产品推荐

