例如我有以下代码:
d = [l for l in open('a.txt', 'r')]
创建后d
,列表推导中打开的流会自动关闭吗?
“也许”。
在使用引用计数的 cPython 中,一旦列表理解完成,文件将被关闭(并且对file
对象的所有引用都将丢失)。
但是 Python 标准并不要求它被关闭。例如,在使用 JVM 垃圾收集器的 jython 中不会立即关闭文件。
确保正确关闭资源的“首选”方法是以下with
语句:
with open(…) as f:
d = [l for l in f]
这将保证文件被关闭。
而且,正如@astynax 指出的那样,您也许可以在d = f.readlines()
此处使用,因为它与列表推导具有相同的语义。
为了向自己证明这一点(在 cpython 中):
>>> 类 Foo(对象): ... def __del__(self): ...打印“在__del__” ...定义__iter__(自我): ...返回迭代器([1, 2, 3, 4]) ... >>> [ x for x in Foo() ] 在__del__ [1、2、3、4]