昨天群里,大家聊到了一个面试题,关于 浅复制 (shallow copy )的。 相信很多人都写过类似的错误代码。
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。 于是,最终只有奇数位置的元素被移除了。