Dalam kod di bawah, objektifnya adalah untuk mencipta fungsi yang dipanggil anti_vokal yang menghilangkan vokal daripada rentetan yang diberikan. Walaupun fungsi itu kelihatan mudah, ia goyah apabila berurusan dengan rentetan "Hey look Words!", menghasilkan "Hy lk Words!". Fungsi ini secara tidak sengaja gagal mengalih keluar "o" akhir dalam "lihat".
text = "Hey look Words!" def anti_vowel(text): textlist = list(text) for char in textlist: if char.lower() in 'aeiou': textlist.remove(char) return "".join(textlist) print anti_vowel(text)
Isu ini berpunca daripada mengubah suai senarai sambil mengulanginya. Pendekatan ini membawa kepada akibat yang tidak dijangka. Untuk membetulkan perkara ini, salinan senarai input hendaklah dibuat, membolehkan penyingkiran vokal yang cekap tanpa menjejaskan kedudukan elemen seterusnya.
for char in textlist[:]: #shallow copy of the list # etc
Untuk pemahaman yang lebih baik, pertimbangkan kod berikut yang menggambarkan masalah:
textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] for char in textlist: print(char, textlist)
Output yang dijangkakan ialah senarai menegak rentetan, tetapi output sebenar ialah:
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!
Semasa gelung berlangsung, elemen dialih keluar daripada senarai, melangkau elemen seterusnya. Dalam kes "lihat", "o" kedua dilangkau kerana indeks telah maju melepasinya. Akibatnya, "o" terakhir dalam "Words" dialih keluar dan bukannya dalam "look."
Memanfaatkan pemahaman senarai Python menawarkan penyelesaian yang lebih bersih dan ringkas:
def remove_vowels(text): # function names should start with verbs! :) return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
Atas ialah kandungan terperinci Mengapakah gelung saya gagal mengalih keluar semua vokal daripada rentetan apabila mengubah suai senarai semasa lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!