回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在重构Python信号处理框架,因为我们遇到了一个最大重复深度错误。你知道吗</p>
<p>对这个错误最可能的解释是,有时单个类的大量实例是从类的its<strong>init</strong>方法递归创建的。实际上,模拟这种情况的实验会导致异常运行时错误:“超过了最大递归深度”。你知道吗</p>
<p>当我将创建链中的下一个元素转移到管理这些对象的容器时,问题似乎消失了,尽管我天真地理解了相同深度的调用堆栈。我通过所有先前创建的对象调用create。(参见示例代码)。你知道吗</p>
<p>我倾向于得出这样的结论:递归深度限制是以某种方式为每个对象(无论是类还是实例)设置的。当我们通过<strong>init</strong>递归创建时,可能会把所有的东西都放在类的堆栈上,就像我们通过同一类的一行实例递归创建它们一样,所有对象的递归深度都非常有限。你知道吗</p>
<p>我正在为这个假设寻求一些证实,但发现很难得到证实或反驳。你知道吗</p>
<pre><code>import sys
class Chunk(object):
pre=None
post=None
def __init__(self, container,pre):
print 'Chunk Created'
self.pre=pre
self.container=container
def create(self,x):
if self.post == None:
self.post=Chunk(self.container,self)
newChunk =self.post
else:
newChunk =self.post.create(x+1)
return newChunk
def droprefs(self):
print 'refcount droprefs start: ', sys.getrefcount(self)
if not self.pre ==None:
self.pre.droprefs()
self.pre=None
self.post=None
self.container=None
print 'refcount droprefs end: ', sys.getrefcount(self)
def claimContainer(self):
self.container.setmasterchunk(self)
self.pre.droprefs()
self.pre=None
class Container(object):
masterchunk=None
def __init__(self):
self.masterchunk=Chunk(self, None)
def setmasterchunk(self, chunk):
print 'refcount 5: ', sys.getrefcount(self.masterchunk)
self.masterchunk=chunk
print 'refcount 6: ', sys.getrefcount(self.masterchunk)
def testrecursion(self,n):
for i in range(n):
print 'refcount 6: ', sys.getrefcount(self.masterchunk)
newChunk=self.masterchunk.create(1)
return newChunk
def testhistoryremoval(self,chunk):
chunk.claimContainer()
if __name__ == '__main__':
C=Container()
middle=C.testrecursion(300)
last=C.testrecursion(600)
last=C.testhistoryremoval(middle)
if middle== C.masterchunk:
print 'SUCCESS'
</code></pre>
<p>添加注释:</p>
<p>显示最大递归深度的代码:</p>
<pre><code>import sys
from time import sleep
class Chunk(object):
pre=None
post=None
def __init__(self, container,pre,n):
print 'Chunk Created'
self.pre=pre
self.container=container
if n>0:
self.post=Chunk(self.container,self,n-1)
def droprefs(self):
print 'refcount droprefs start: ', sys.getrefcount(self)
if not self.pre ==None:
self.pre.droprefs()
self.pre=None
self.post=None
self.container=None
print 'refcount droprefs end: ', sys.getrefcount(self)
def claimContainer(self):
self.container.setmasterchunk(self)
self.pre.droprefs()
self.pre=None
class Container(object):
masterchunk=None
def __init__(self):
pass
def setmasterchunk(self, chunk):
print 'refcount 5: ', sys.getrefcount(self.masterchunk)
self.masterchunk=chunk
print 'refcount 6: ', sys.getrefcount(self.masterchunk)
def testrecursion(self,n):
self.masterchunk=Chunk(self,None,n)
if __name__ == '__main__':
print('Try 10')
C0=Container()
C0.testrecursion(10)
sleep(2)
print('Try 1000')
C1=Container()
C1.testrecursion(1000)
</code></pre>