python中巨型列表类对象的长度

问题描述

我正在创建一个类似列表的对象,其中包含大量元素,但是当我运行以下代码时,出现错误

class test:
    def __init__(self,n):
        self.n = n
        
    def __len__(self):
        return self.n
    
instance = test(10**20)
print(len(instance))

我返回的错误是: 溢出错误:无法将“int”放入索引大小的整数中

有人知道出了什么问题吗?

解决方法

这是一个 CPython 实现细节。来自__len__ docs

在 CPython 中,长度最多为 sys.maxsize。如果 长度大于 sys.maxsize 某些特征(例如 len()) 可能会引发 OverflowError。防止通过真相引发 OverflowError 值测试,一个对象必须定义一个 __bool__() 方法。