[Python-Dev] Re: weakref gc semantics

Michael Hudson mwh at python.net
Fri Nov 5 12:48:16 CET 2004


Tim Peters <tim.peters at gmail.com> writes:

[stuff i admittedly haven't thought terribly hard about]

> The former is accurate independent of whether we're talking about
> cyclic trash now, but that latter would not be.  For example,
>
> def callback(ignore):
>     print 'hi'
>
> class C:
>     pass
>
> c = C()
> w = weakref.ref(c, callback)
> w = None
> c = None
>
> The callback outlives c, but the callback doesn't get invoked, because
> w didn't outlive c.  The callback does get invoked if the order of the
> last two lines is swapped.  It's easy to explain this in terms of
> which of {c, w} goes away first, but not in terms of callback's
> lifetime.

As disclaimed above, I haven't thought about this a great deal, but I
would expect it to be the lifetime of the weakref which matters -- in
the not-all-that-unlikley case of the callback not being a lambda or
local function, it is *always* going to be reachable, and indeed is
never going to die until the process exits...

I take it the changes you're proposing aren't going to change the
semantics of the quoted code?

Cheers,
mwh

-- 
  I'm about to search Google for contract assassins to go to Iomega
  and HP's programming groups and kill everyone there with some kind
  of electrically charged rusty barbed thing.
                -- http://bofhcam.org/journal/journal.html, 2002-01-08


More information about the Python-Dev mailing list