扬帆大鱼
您正在修改正在迭代的列表,这必然会导致一些不直观的行为。相反,创建列表的副本,这样就不会从迭代的内容中删除元素。for char in textlist[:]: #shallow copy of the list # etc为了澄清你所看到的行为,看看这个。放print char, textlist在您的(原始)循环的开头。您可能会期望,这将垂直地打印出字符串,并在列表旁边打印出来,但实际上您将得到以下内容:H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # !l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!! ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']Hy lk Words!那怎么回事?好人for x in yPython中的循环实际上只是语法糖:它仍然按索引访问List元素。因此,当您在迭代列表时从列表中删除元素时,您将开始跳过值(如上面所示)。因此,你永远看不到第二个o在……里面"look";跳过它,因为当删除前一个元素时,索引已经“过去”了。然后,当你到达o在……里面"Words",您将移除第一次出现的'o'就是你以前跳过的那个。正如其他人所提到的,清单理解可能是一种更好(更干净、更清晰)的方法。利用Python字符串是可迭代的事实:def remove_vowels(text): # function names should start with verbs! :) return ''.join(ch for ch in text if ch.lower() not in 'aeiou')