Inner workings of this Python feature: Can a Python data structure reference itself?

Chris Angelico rosuav at gmail.com
Sun May 3 01:46:52 EDT 2015


On Sun, May 3, 2015 at 2:43 PM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> On Sat, May 2, 2015 at 2:17 PM, Tim Chase <python.list at tim.thechases.com> wrote:
>> If you know that you're creating such cyclical structures, it's best
>> to manually unlink them before freeing them:
>>
>>   lst = []
>>   lst.append(lst) # create the cycle
>>   lst[:] = []   # break the cycle
>>   # or lst.remove(lst) # though this takes more care
>>   del lst
>
> In general, this shouldn't be necessary. I believe that reference
> cycles are guaranteed to be cleaned up in all major implementations of
> Python, except that in CPython prior to version 3.4 reference cycles
> containing objects with finalizers would not be collected. So the
> better advice would be "don't use finalizers in reference cycles if
> you need compatibility with Python 3.3 or earlier."

It's not strictly necessary, but you can help things along by breaking
the cycle - if you're doing this kind of thing in a loop, breaking the
cycle will most likely give more consistent memory usage, whereas the
GC will potentially pick up a bunch of them all at once.

In simple applications, it's not a big deal either way. Just write
your code, and let Python worry about memory. But if it doesn't cost
you much to break the loop, you may as well do it  Sometimes it even
improves code clarity - showing that you're definitely done with this
thing now, even though in theory you might still be iterating over it.
Just don't warp your code around memory usage, because that's not what
Python's meant for. :)

ChrisA



More information about the Python-list mailing list