Python io流会在列表理解中自动关闭吗?

时间:2012-06-14 05:45:55

标签: python io

例如,我有以下代码:

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

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

1 个答案:

答案 0 :(得分:18)

“也许”。

在使用引用计数的cPython中,一旦列表理解完成,文件将被关闭(并且对file对象的所有引用都将丢失)。

但是Python标准不会要求它被关闭。例如,文件不会立即在使用JVM垃圾收集器的jython中关闭。

确保资源正确关闭的“首选”方法是with语句:

with open(…) as f:
    d = [l for l in f]

保证文件关闭。

而且,正如@astynax指出的那样,你可以在这里使用d = f.readlines(),因为它与列表理解具有相同的语义。

为了证明这一点(在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]