For example I have the following code:
d = [l for l in open('a.txt', 'r')]
After d is created, will the stream opened in the list comprehension get closed automatically ?
解决方案
"Maybe".
In cPython, which uses refcounting, the file will be closed as soon as the list comprehension finishes (and all references to the file object are lost).
But the Python standard does not require that it be closed. For example, the file will not be closed immediately in jython, which uses the JVM garbage collector.
The "preferred" method of ensuring that resources are correctly closed is the with statement:
with open(…) as f:
d = [l for l in f]
This will guarantee that the file get closed.
And, as @astynax points out, you might be able to use d = f.readlines() here, as it would have the same semantics as the list comprehension.
To prove this to yourself (in cpython):
>>> class Foo(object):
... def __del__(self):
... print "in __del__"
... def __iter__(self):
... return iter([1, 2, 3, 4])
...
>>> [ x for x in Foo() ]
in __del__
[1, 2, 3, 4]