Python, lỗi trong vòng lặp for?

lst = [0,2,4]
for x in lst:
    if x % 2 == 0:
        lst.remove(x)
print(lst)

Như mong muốn của mình thì kết quả trả về phải là list rỗng, nhưng nó lại trả về [2]
Mình có thử tiếp với list = [0,2,4,6,8,10] thì kết quả trả về là [2,6,10]
Với list=[0,1,2,3,4,5,6,7,8,9,10], kết quả là [2,3,5,7,9]

Mình không nghĩ ra sai ở đâu mà nó xét item ngắt quãng thế nhỉ?

1 Like

Y chang:

3 Likes

Do duyêt qua danh sách mà có chỉnh sửa (thay đổi chính danh sách đó):
Trong ví dụ của bạn thì lần đầu x sẽ là 0 tương ứng phần tử ở vị trí thứ 0, sau khi bạn remove x = 0 thì list = [2,4], đến lần lặp thứ 2 sẽ duyệt phần tử ở vị trí thứ 1 nên x=4 ở lần duyệt thứ 2 và phần tử có giá trị là 2 sẽ bị bỏ qua. list(lst) sẽ tạo ra 1 list khác để duyệt, ko ảnh hưởng đến lst của bạn

lst = [0,2,4]
for x in list(lst):
    if x % 2 == 0:
        lst.remove(x)
print(lst)
6 Likes

Đã copy list thì thà dùng comprehension hay hơn:

new_list = [x for x in lst if x % 2 != 0]

Còn muốn sửa list thì gán lui lại rồi cắt đuôi bằng pop.

5 Likes

Không nên xử lý cái chính cái list mà mình đang loop bằng “for”, vì khi đó index của item torng list sẽ bị thay đổi, dẫn đến loop bị thay đổi hành vi so với mình mong muốn

mà nên tạo ra 1 copy của nó để chạy như " Uther Pally" đã đưa ra bên trên. Cài trick đơn giản là “list(lst)” thôi

5 Likes

Bạn vào đây debug từng bước bằng giao diện đồ hoạ sẽ dễ hiểu hơn.
https://pythontutor.com/visualize.html#mode=edit

1 Like

Thế mà nghĩ mãi không ra :vv
Cảm ơn bạn!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?