我想实现一个程序来检查容器类型的对象中是否存在循环引用。幸运的是我在
我把源代码粘贴在这里,但是它似乎是错误的,正如文章底部的评论所说。在
我可以根据源代码实现正确的版本吗?在import gc
import pprint
import Queue
class Graph(object):
def __init__(self, name):
self.name = name
self.next = None
def set_next(self, next):
print 'Linking nodes %s.next = %s' % (self, next)
self.next = next
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__, self.name)
# Construct a graph cycle
one = Graph('one')
two = Graph('two')
three = Graph('three')
one.set_next(two)
two.set_next(three)
three.set_next(one)
seen = set()
to_process = Queue.Queue()
# Start with an empty object chain and Graph three.
to_process.put( ([], three) )
# Look for cycles, building the object chain for each object we find
# in the queue so we can print the full cycle when we're done.
while not to_process.empty():
chain, next = to_process.get()
chain = chain[:]
chain.append(next)
print 'Examining:', repr(next)
seen.add(id(next))
for r in gc.get_referents(next):
if isinstance(r, basestring) or isinstance(r, type):
# Ignore strings and classes
pass
elif id(r) in seen:
print 'Found a cycle to %s:' % r
for i, link in enumerate(chain):
print ' %d: ' % i,
pprint.pprint(link)
else:
to_process.put( (chain, r) )