例如,我有以下代码:
d = [l for l in open('a.txt', 'r')]
创建d
后,列表解析中打开的流会自动关闭吗?
答案 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]