Попробуйте запустить программу снова, за исключением оператора fin = open(...)
внутри функции build_list_append()
(обязательно добавьте также fin.close()
в конце). Затем они будут действовать так же.
Файловые объекты в python (возвращаемые open()
) принадлежат классу объектов, называемому generator *. Генераторы являются итеративными и лениво возвращают элемент за элементом по мере необходимости. Что отличает их, скажем, от списков, так это то, что вы не можете go назад в генераторе - вы можете получить только следующий элемент. Поэтому, когда у вас заканчиваются элементы, вы ничего не получаете.
Вот что здесь происходит. L oop for line in fin
исчерпывает все элементы, которые может создать файловый объект, при первом запуске. Когда вы выполняете его снова, генератору больше нечего отдавать, и поэтому for
l oop не запускается, и вы получаете пустой список. Если вы заново не создадите генератор с самого начала, снова вызвав open()
, в нем закончатся элементы.
* это сложнее, чем это, и технически файловые объекты не являются генераторами, но они действуют достаточно похоже, чтобы провести сравнение.