Прерывается проверка списка в цикле

import os
import win32api

path = ['E:/keys.txt', 'G:/keys.txt']  # Эти файлы не существуют

result_path = path
for x in path:
    if os.path.isfile(x) is False:
        volume_lbl = win32api.GetVolumeInformation(x[:3])
        print(f'Ключ отсутствует на накопителе {x[:3]} с меткой {volume_lbl[0]}!')
        result_path.remove(x)

Функция должна проверять наличие файла по пути, содержащемся в списке. Проблема в том, что если файлы не существуют, цикл for прерывается, не доходя до конца списка path. После выполнения result_path будет содержать ['G:/keys.txt'], хотя по моей логике список должен остаться пустым. Я пробовал инвертировать if, делать цикл while (а-ля C++) - не помогло. Как починить?


Ответы (2 шт):

Автор решения: Михаил Алексеевич

Всё дело в модели управления памятью в python.

Вы создаёте объект list path

Потом присваиваете result_path его "значение".

Внутри python это работает не так, как ожидает большинство новичков.

result_path и path ссылаются на один и тот же list.

В результате, при изменении в result_path изменяется path. Это приводит к работе Вашего цикла for не как Вы задумывали.

Что делать? Использовать например такие конструкции:

result_path  = deepcopy(path)

или

result_path  = list(path)
→ Ссылка
Автор решения: Vasily

Вы немного запутались в коде, нужно удалять элемент не из result_path, а из path. НО так вы будете удалять элемент из списка во время итерации по списку, что неправильно. И в целом не понятно, зачем вы удаляете элементы списка в вашем решении - я бы предложил просто удалить эту строку

import os
import win32api

path = ['E:/keys.txt', 'G:/keys.txt']  # Эти файлы не существуют

for x in path:
    if os.path.isfile(x) is False:
        volume_lbl = win32api.GetVolumeInformation(x[:3])
        print(f'Ключ отсутствует на накопителе {x[:3]} с меткой {volume_lbl[0]}!')
→ Ссылка