Why does list.remove() not behave as one might expect?

后端 未结 3 737
温柔的废话
温柔的废话 2020-12-15 11:34
from pprint import *

sites = [[\'a\',\'b\',\'c\'],[\'d\',\'e\',\'f\'],[1,2,3]]

pprint(sites)

for site in sites:
        sites.remove(site)

pprint(sites)
<         


        
3条回答
  •  时光取名叫无心
    2020-12-15 12:39

    Because resizing a collection while iterating over it is the Python equivalent to undefined behaviour in C and C++. You may get an exception or subtly wrong behaviour. Just don't do it. In this particular case, what likely happens under the hood is:

    • The iterator starts with index 0, stores that it is at index 0, and gives you the item stored at that index.
    • You remove the item at index 0 and everything afterwards is moved to the left by one to fill the hole.
    • The iterator is asked for the next item, and faithfully increments the index it's at by one, stores 1 as the new index, and gives you the item at that index. But because of said moving of items caused by the remove operation, the item at index 1 is the item that started out at index 2 (the last item).
    • You delete that.
    • The iterator is asked for the next item, but signals end of iteration as the next index (2) is out of range (which is now just 0..0).

提交回复
热议问题