Hello,
2008/8/25 Robert Schuppenies <[EMAIL PROTECTED]>:
> Hi.
>
> Could you please explain to me why some iterators have a tp_traverse
> implementation and others do not? For example tupleiterator has one,
> but none of the dict iterators. Same for set iterators (and possibly
> others). It shows in Python when you use the get_referents function.
>
>>>> t = (1,2,3)
>>>> gc.get_referents(iter(t))
> [(1, 2, 3)]
>>>> s = set([1,2,3])
>>>> gc.get_referents(iter(s))
> []
>>>> d = {1:1, 2:2}
>>>> gc.get_referents(iter(d))
> []
>
> And is it correct that you can rephrase the question to 'why some
> iterators are seen as container objects and others are not'?
Yes, this can lead to some object cycle that are not collected.
See the attached script: a cycle involving a list iterator is
collected by the garbage collector, but a cycle with a dict iterator
is not.
This is worth a bug report IMO.
--
Amaury Forgeot d'Arc
import gc, weakref
def test_container_iterator(i):
class C(object):
pass
obj = C()
ref = weakref.ref(obj)
if i == 1:
container = (obj,)
elif i==2:
container = [obj,]
elif i==3:
container = {obj: 1}
elif i==4:
container = {1: obj}
print "Container:", container,
obj.x = iter(container)
del obj, container
gc.collect()
if ref() is None:
print "OK"
else:
print "Cycle was not collected!!"
# Break the cycle
del ref().x
# Now it is.
assert ref() is None
test_container_iterator(1)
test_container_iterator(2)
test_container_iterator(3)
test_container_iterator(4)
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com