散列嵌套元组的限制?

时间:2017-07-11 10:09:36

标签: python python-3.x hash

几行代码展示了我的要求:

>>> x = ()
>>> for i in range(1000000):
...     x = (x,)


>>> x.__hash__()

=============================== RESTART: Shell ===============================

1000000可能过多,但它表明在散列嵌套元组时存在某种形式的限制(我假设其他对象)。只是为了澄清,我没有重新启动shell,它在我尝试哈希时自动完成。

我想知道的是这个限制是什么,它为什么会发生(以及为什么它不会引发错误),并且有一种解决方法(这样我就可以将这样的元组放入集合或字典中)

1 个答案:

答案 0 :(得分:3)

__hash__ method of tuple计算元组中每个项目的哈希值 - 在您的情况下就像递归函数一样。因此,如果你有一个深度嵌套的元组,那么它最终会有一个非常深的递归。在某些时候,堆栈上可能没有足够的内存来“更深一层”。这也是没有Python异常的“shell重启”的原因 - 因为重写是在C中完成的(至少对于CPython来说)。您可以使用,gdb来获取有关异常的更多信息或进行调试。

没有全局硬限制,限制取决于您的系统(例如,多少堆栈)以及涉及多少函数调用(内部)以及每个函数调用需要多少“堆栈”。

然而,在实现中可能有资格作为Bug,因此最好将其发布在Python问题跟踪器上:CPython issue tracker