我想實作一個程式來檢查容器類型的對象中是否存在循環引用。幸運的是我在
我把源代碼粘貼在這裡,但是它似乎是錯誤的,正如文章底部的評論所說。在
我可以根據源代碼實作正确的版本嗎?在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) )