sta*_*dds 5 python hash python-3.x
演示我所要求的内容的几行代码是:
>>> x = ()
>>> for i in range(1000000):
... x = (x,)
>>> x.__hash__()
=============================== RESTART: Shell ===============================
Run Code Online (Sandbox Code Playgroud)
1000000 可能过多,但它表明在散列嵌套元组(并且我假设其他对象)时存在某种形式的限制。只是为了澄清,我没有重新启动 shell,当我尝试哈希时它会自动执行此操作。
我想知道这个限制是什么,为什么会发生(以及为什么它没有引发错误),以及是否有解决方法(以便我可以将这样的元组放入集合或字典中)。
__hash__计算元组中每个项目的哈希值的方法tuple-在您的情况下就像递归函数。因此,如果您有一个深度嵌套的元组,那么它最终会产生非常深的递归。在某些时候,堆栈上可能没有足够的内存来“更深一层”。这也是为什么“shell 重新启动”而没有 Python 异常的原因 - 因为递归是在 C 中完成的(至少对于 CPython 而言)。您可以使用gdb来获取有关异常的更多信息或对其进行调试。
不会有全局硬限制,限制取决于您的系统(例如,有多少堆栈)以及涉及多少个函数调用(内部)以及每个函数调用需要多少“堆栈”。
然而,这可能会被视为实现中的 Bug,因此最好将其发布到 Python 问题跟踪器:CPython 问题跟踪器上。