Skip to main content
 首页 » 编程设计

python之list.remove() 方法未提供预期结果

2025年05月04日16lyj

在尝试从列表中删除所有不以特定子字符串开头的文件名时,我遇到了以下意外行为:

>>> 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)