При попытке удалить все имена файлов не начинающиеся с определенной подстрокой из списка, я столкнулся следующим неожиданное поведение:list.remove() не обеспечивает ожидаемые результаты
>>> allfiles = os.listdir(mydir)
>>> allfiles
['dwcpybyext.sh', 'dwlaunch', 'libupdate.sh', 'ntpsync.sh']
>>> for f in allfiles:
... if f.startswith('n') == False:
... allfiles.remove(f)
...
>>> allfiles
['dwlaunch', 'ntpsync.sh']
Это теоретически должно иметь удален каждые имя файла не начинается с 'n'
из списка. Вместо этого он остается одним, начиная с 'd'
в списке. Если я меняю цикл на использование if f.startswith('d') == False:
, я получаю ['dwcpybyext.sh', 'dwlaunch', 'ntpsync.sh']
- последний элемент даже не содержит символ 'd'
.
Почему я вижу это поведение? Вероятно, это ошибка в методе list.remove()
Python. Я получаю такое же поведение, если подставляю del allfiles[allfiles.index(f)]
, а .remove()
- это в основном просто псевдоним для этого.
Читайте примечание в разделе 7.3: http://docs.python.org/reference/compound_stmts.html #for –