Python TypeError: 'NoneType' object is not subscriptable 报错原因与修复
本文解析Python中常见的TypeError: 'NoneType' object is not subscriptable错误。该错误通常源于将返回None的方法(如random.shuffle)赋值给变量,导致后续对None进行索引操作。文章通过代码示例说明问题根源,并提供移除赋值语句的正确修复方案,帮助开发者快速定位并解决此类类型错误。
问题发现与现象
问题发现
在编写Python代码时遇到了上述报错,查阅网络上的解决方案,发现大多数建议都是“重新定义该变量”,这种回答让人难以理解其背后的逻辑。
经过排查,发现根本原因在于将返回None的方法结果赋值给了变量,随后对该变量进行操作从而触发了错误。以下是具体代码示例。
错误代码示例
for i in range(2000):
read_lines = random.shuffle(read_lines) # 问题出在这里了
print(read_lines)
从代码表面看似乎没有明显问题,但实际运行时会直接抛出异常。
报错信息分析
>>TypeError: 'NoneType' object is not subscriptable
问题的核心在于random.shuffle函数本身返回None,但代码中将其赋值给了read_lines变量。这导致read_lines的值变为None,后续任何对read_lines的操作(包括打印)都会引发TypeError。
查看random库中shuffle方法的源码注释可知,该函数明确说明其返回值为None。
源码机制解析
def shuffle(self, x, random=None):
"""
Shuffle list x in place, and return None.
Optional argument random is a 0-argument function returning a
random float in [0.0, 1.0); if it is the default None, the
standard random.random will be used.
"""
if random is None:
randbelow = self._randbelow
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = randbelow(i+1)
x[i], x[j] = x[j], x[i]
else:
_int = int
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i+1))
x[i], x[j] = x[j], x[i]
解决方案
只需修改上述赋值语句即可解决问题。
修复方案
for i in range(2000):
random.shuffle(read_lines)
print(read_lines)
content_list = []
总结
至此,关于Python报错TypeError: 'NoneType' object is not subscriptable的解决方法介绍完毕。如需了解更多相关内容,可搜索本站往期文章或继续浏览后续文章,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









