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