[Tutor] How to open the closed file again?

Dave Angel davea at ieee.org
Tue Jan 5 15:41:12 CET 2010


Andre Engels wrote:
> On Tue, Jan 5, 2010 at 1:46 PM, 朱淳 <zhuchunml at gmail.com> wrote:
>   
>> I've token a dictionary to save filenames, and write it into "constant.py".
>> And I think it's a good method to create a class as Andre wrote.  Thank you
>> all!
>> By the way, if I close a open file object, will the closed file object still
>> occupy the memory ? As I saw in a list, this kind of unusable file object
>> wasn't cleaned by GC. What will happen if there's no list?
>>     
>
> In general, when an object is not referred any more in Python code, it
> will be garbage collected (and thus the memory it occupies will become
> free); however, this is not robust nor fully consistent over
> implementation, and it is therefore unadvisable to write code that
> relies too heavily on this.
>
>
>   
If I believed that, clearly I would not use Python for anything real.

I think you're confusing the issue of things like file objects 
automatically closing their resources when they go out of scope.  That's 
not guaranteed to happen in any reasonable time.  And you should use a 
context manager such as *with* or do explicit close in a try/finally 
situation.

However, although garbage collection may be lazier in one implementation 
than another, if you attempt to program explicit del for all allocated 
objects, you might as well use C.  Further, there are more invisible 
objects being created and destroyed than the ones you have control 
over.  You have to trust the mechanism, whether it's ref counting or 
gc.  Incidentally, del doesn't free the object.  It just removes one 
reference to it.  It still may be gc'ed now, or later, and of course not 
at all if there are other references to it.

In other words, when an object holds a scarce resource, do some explicit 
boxing on it to assure the resource is released.  If it's memory, ignore it.

Back to 朱淳  :

Those objects still existed because they were referenced in the list.  
You could del them from the list, or replace them with different 
objects.  Same is true for "scalar variables" (to borrow a term from 
other languages).   If you say  X = obj    then the object will exist at 
least as long as X is unchanged.  If you say X = otherobj   or  X = None 
(which is another singleton object) then the reference to the original 
object goes away.  And sooner or later, it'll get gc'ed.   If you say  
del X, then not only the reference goes away, but X is no longer in the 
namespace.

DaveA



More information about the Tutor mailing list