在尝试从列表中删除所有不以特定子字符串开头的文件名时,我遇到了以下意外行为:
>>> 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' 字符。
为什么我会看到这种行为?这似乎不太可能是 Python 的 list.remove() 方法中的错误——如果我替换 del allfiles[allfiles.index(f)],而 .remove() 基本上只是一个别名。
请您参考如下方法:
在迭代列表的同时修改列表是一个非常糟糕的主意。尝试下一个:
allfiles = filter(lambda x: x.startswith('n'), allfiles)
