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

Der*_*ang 10 python io

例如,我有以下代码:

d = [l for l in open('a.txt', 'r')]
Run Code Online (Sandbox Code Playgroud)

之后d被创建,将在列表理解拉开流都会自动关闭?

Dav*_*ver 18

"也许".

在使用引用计数的cPython中,文件将在列表推导完成后立即关闭(并且对该file对象的所有引用都将丢失).

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

确保资源正确关闭的"首选"方法是with声明:

with open(…) as f:
    d = [l for l in f]
Run Code Online (Sandbox Code Playgroud)

保证文件关闭.

而且,正如@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]