items = list(range(1, 11))

while items:
    tmp_items = items     # tmp_items referred to items
    for i in tmp_items:
        items.remove(i)
    print items

通过一个for loop遍历删除列表中的元素(这里示例1到10)。最终执行的结果是

[2, 4, 6, 8, 10]
[4, 8]
[8]
[]

可以看到,每次循环,只有奇数位的数字被从列表移除了,偶数位的数字被保留下来。

这跟列表是一个链表结构有关系。

第二,这里的 tmp_items = items 是**浅复制**, tmp_items只是items的**引用**

迭代器在遍历列表的时候,从head开始

head -> pointer1 -> 1
        pointer2 -> 2
        ...
        pointer10 -> 10

循环开始,首先删除第一个元素(1),此时,对应的head指针移动到指针2

head -> pointer2 -> 2
        ...
        pointer10 -> 10

继续遍历时, head->next 指向的是已经是元素3。 于是,最终只有奇数位置的元素被移除了。

标签: 浅复制

添加新评论