Прерывается проверка списка в цикле
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)
Вы немного запутались в коде, нужно удалять элемент не из 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]}!')