10

例如我有以下代码:

d = [l for l in open('a.txt', 'r')]

创建后d,列表推导中打开的流会自动关闭吗?

4

1 回答 1

18

“也许”。

在使用引用计数的 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]
于 2012-06-14T05:55:16.677 回答