Python 哈希嵌套元组的限制?

Python 哈希嵌套元组的限制?,python,python-3.x,hash,Python,Python 3.x,Hash,下面几行代码演示了我的问题: >>> x = () >>> for i in range(1000000): ... x = (x,) >>> x.__hash__() =============================== RESTART: Shell =============================== 1000000可能太多了,但它表明对嵌套元组进行散列时存在某种形式的限制(我假设还有其他对象)。只是澄

下面几行代码演示了我的问题:

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


>>> x.__hash__()

=============================== RESTART: Shell ===============================
1000000可能太多了,但它表明对嵌套元组进行散列时存在某种形式的限制(我假设还有其他对象)。只是澄清一下,我没有重新启动shell,当我尝试哈希时,它会自动重启

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

计算元组中每个项的哈希值-在您的例子中,就像递归函数一样。所以,如果你有一个嵌套很深的元组,那么它最终会有一个非常深的递归。在某些时候,堆栈上可能没有足够的内存来“更深一层”。这也是“shell重新启动”没有Python异常的原因——因为递归是在C语言中完成的(至少对于CPython是这样)。您可以使用,即获取有关异常的更多信息或对其进行调试

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


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

stybl,不允许使用“重启shell”吗?我需要它来显示发生了什么,现在还不清楚。在我的例子中,结果是
分段错误(内核转储)
,并且退出了python外壳(ubuntu上的python 3.5)。我在Windows10上使用Python3.5.2,对我来说,它每次都会重新启动shell,因为shownIt非常吸引人。这似乎在很大程度上取决于您的系统。在我的windows PC上,我能找到的最大嵌套元组数是41882,但是我的linux机器在80000以上没有问题。因此,我假设没有办法将这样的对象放入一个集合中,或者将其用作字典键?@stanleydodds在您提到的特定情况下:没有。只要Python想要计算该元组的
哈希值
,解释器就会出错。请注意,如果要执行其他操作,也会出现问题,例如:
print(x)
,这会导致类似的问题。然而,
\uuu str\uuu
方法是递归感知的,因此给出了
递归错误:在获取元组的repr时超过了最大递归深度。