Lifetime of a local reference

Roel Schroeven roel at roelschroeven.net
Wed Feb 27 16:39:05 EST 2019


Rhodri James schreef op 27/02/2019 om 15:18:
> On 27/02/2019 06:56, Marko Rauhamaa wrote:
>> Alan Bawden <alan at csail.mit.edu>:
>>> But I appreciate that that isn't the true question that you wanted to ask!
>>> You are wondering if a Python implementation is _permitted_ to treat the
>>> code you wrote _as if_ you had written:
>>>
>>>      def fun():
>>>          f = open("lock")
>>>          flock.flock(f, fcntl.LOCK_EX)
>>>          del f
>>>          do_stuff()
>>>          sys.exit(0)
>>>
>>> which deletes the variable f from the local environment at a point where it
>>> will never be used again.  (Which could cause the lock to be released
>>> before do_stuff is even called.)
>>>
>>> This is an interesting question, and one that any garbage collected
>>> language should probably address somehow.
> 
> Interesting indeed.  My gut instinct was "Hell, no!", but as Marko
> points out C optimisers do exactly that, and I don't find it
> particularly surprising in practice.  I don't think that there is
> anything in the docs that says a compliant implementation couldn't
> delete variables early.  The nearest you get is repeated reminders that
> you can't make assumptions about when destructors will be run.
Aren't we overthinking this?

I think it's pretty clear that a variable is never deleted before it 
goes out of scope. A quick search in the documentation points me to 
(https://docs.python.org/3/reference/datamodel.html#objects-values-and-types):

"Objects are never explicitly destroyed; however, when they become 
unreachable they may be garbage-collected. An implementation is allowed 
to postpone garbage collection or omit it altogether — it is a matter of 
implementation quality how garbage collection is implemented, *as long 
as no objects are collected that are still reachable*." (emphasis mine)

In the original example (without del), f is reachable everywhere in the 
function after the initial binding, so it can not be deleted.

Comparisons with C on this point don't seem very relevant: C doesn't 
have destructors or garbage collection. I don't even see what the C 
equivalent for "del f" could be. You could perhaps compare with C++, 
where destructors are also not called before the object goes out of 
scope (a difference is that in C++ the destructor explicitly always is 
called at that moment).

Regards,
Roel

-- 
"Honest criticism is hard to take, particularly from a relative, a
friend, an acquaintance, or a stranger."
         -- Franklin P. Jones

Roel Schroeven




More information about the Python-list mailing list