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

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


>>> x.__hash__()

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

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

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

最佳答案

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

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

但是,这可能在实现中被视为错误,因此最好将其发布在 Python 问题跟踪器上: CPython issue tracker

关于python - 散列嵌套元组的限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45031538/

10-14 12:55
查看更多