Python类堆栈帧限制

时间:2012-05-31 04:51:46

标签: python class stackframe

如果我有以下格式的课程:

class TestClass:
  def __init__(self):
    self.value = 0

  def getNewObject(self):
    return TestClass()

我可以调用该函数的次数是否有限制?例如:

obj = TestClass()
obj.getNewObject().getNewObject()

我可以在getNewObject()的返回值上调用getNewObject()的次数有限制吗?如果是这样,哪些因素会影响这个?

2 个答案:

答案 0 :(得分:4)

我对此表示怀疑。让我怀疑的一个原因是,如果我们有这个功能:

def test(obj):
    obj.getNewObject().getNewObject().getNewObject()

我们disassemble it

import dis
dis.dis(test)

我们得到了这个:

  2           0 LOAD_FAST                0 (obj)
              3 LOAD_ATTR                0 (getNewObject)
              6 CALL_FUNCTION            0
              9 LOAD_ATTR                0 (getNewObject)
             12 CALL_FUNCTION            0
             15 LOAD_ATTR                0 (getNewObject)
             18 CALL_FUNCTION            0
             21 POP_TOP             
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE        

这只是LOAD_ATTR后续CALL_FUNCTION的重复。我无法想象这需要很多内存或其他资源来管理。因此,可能没有限制。

答案 1 :(得分:1)

Python中有一个递归限制(可调),但这是无关的。每次调用都是在前一次调用完成后进行的,因此它们都是从堆栈帧的相同级别(即来自您的用户代码)调用的。现在,您可能会遇到行长限制或某些内容,尤其是对于交互式Python shell。