Python TypeError: 'NoneType' object is not subscriptable 报错原因与修复

阿澈
阿澈
发布时间:2026-10-14 | 3人浏览过
原创

本文解析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的解决方法介绍完毕。如需了解更多相关内容,可搜索本站往期文章或继续浏览后续文章,感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表