mirror of
https://github.com/leisurelicht/wtfpython-cn.git
synced 2025-03-06 16:50:09 +08:00
EX.Deleting a list item while iterating
This commit is contained in:
parent
403636b5b3
commit
b739f93c85
28
README.md
28
README.md
@ -57,7 +57,7 @@ So, here we go...
|
||||
- [Section: Watch out for the landmines!](#section-watch-out-for-the-landmines)
|
||||
- [> Modifying a dictionary while iterating over it/迭代字典时的修改](#-modifying-a-dictionary-while-iterating-over-it迭代字典时的修改)
|
||||
- [> Stubborn `del` operator/坚强的 `del` *](#-stubborn-del-operator坚强的-del-)
|
||||
- [> Deleting a list item while iterating](#-deleting-a-list-item-while-iterating)
|
||||
- [> Deleting a list item while iterating/迭代列表时删除元素](#-deleting-a-list-item-while-iterating迭代列表时删除元素)
|
||||
- [> Loop variables leaking out!](#-loop-variables-leaking-out)
|
||||
- [> Beware of default mutable arguments!](#-beware-of-default-mutable-arguments)
|
||||
- [> Catching the Exceptions](#-catching-the-exceptions)
|
||||
@ -1425,7 +1425,7 @@ Deleted!
|
||||
|
||||
---
|
||||
|
||||
### > Deleting a list item while iterating
|
||||
### > Deleting a list item while iterating/迭代列表时删除元素
|
||||
|
||||
```py
|
||||
list_1 = [1, 2, 3, 4]
|
||||
@ -1458,30 +1458,30 @@ for idx, item in enumerate(list_4):
|
||||
[2, 4]
|
||||
```
|
||||
|
||||
Can you guess why the output is `[2, 4]`?
|
||||
你能猜到为什么输出是 `[2, 4]` 吗?
|
||||
|
||||
#### 💡 Explanation:
|
||||
#### 💡 说明:
|
||||
|
||||
* It's never a good idea to change the object you're iterating over. The correct way to do so is to iterate over a copy of the object instead, and `list_3[:]` does just that.
|
||||
* 在迭代时修改对象是一个很愚蠢的主意. 正确的做法是迭代对象的副本, `list_3[:]` 就是这么做的.
|
||||
|
||||
```py
|
||||
>>> some_list = [1, 2, 3, 4]
|
||||
>>> id(some_list)
|
||||
139798789457608
|
||||
>>> id(some_list[:]) # Notice that python creates new object for sliced list.
|
||||
>>> id(some_list[:]) # 注意python为切片列表创建了新对象.
|
||||
139798779601192
|
||||
```
|
||||
|
||||
**Difference between `del`, `remove`, and `pop`:**
|
||||
* `del var_name` just removes the binding of the `var_name` from the local or global namespace (That's why the `list_1` is unaffected).
|
||||
* `remove` removes the first matching value, not a specific index, raises `ValueError` if the value is not found.
|
||||
* `pop` removes the element at a specific index and returns it, raises `IndexError` if an invalid index is specified.
|
||||
**`del`, `remove` 和 `pop` 的不同:**
|
||||
* `del var_name` 只是从本地或全局命名空间中删除了 `var_name` (这就是为什么 `list_1` 没有受到影响).
|
||||
* `remove` 会删除第一个匹配到的指定值, 而不是特定的索引, 如果找不到值则抛出 `ValueError` 异常.
|
||||
* `pop` 则会删除指定索引处的元素并返回它, 如果指定了无效的索引则抛出 `IndexError` 异常.
|
||||
|
||||
**Why the output is `[2, 4]`?**
|
||||
- The list iteration is done index by index, and when we remove `1` from `list_2` or `list_4`, the contents of the lists are now `[2, 3, 4]`. The remaining elements are shifted down, i.e., `2` is at index 0, and `3` is at index 1. Since the next iteration is going to look at index 1 (which is the `3`), the `2` gets skipped entirely. A similar thing will happen with every alternate element in the list sequence.
|
||||
**为什么输出是 `[2, 4]`?**
|
||||
- 列表迭代是按索引进行的, 所以当我们从 `list_2` 或 `list_4` 中删除 `1` 时, 列表的内容就变成了 `[2, 3, 4]`. 剩余元素会依次位移, 也就是说, `2` 的索引会变为 0, `3` 会变为 1. 由于下一次迭代将获取索引为 1 的元素 (即 `3`), 因此 `2` 将被彻底的跳过. 类似的情况会交替发生在列表中的每个元素上.
|
||||
|
||||
* Refer to this StackOverflow [thread](https://stackoverflow.com/questions/45946228/what-happens-when-you-try-to-delete-a-list-element-while-iterating-over-it) explaining the example
|
||||
* See also this nice StackOverflow [thread](https://stackoverflow.com/questions/45877614/how-to-change-all-the-dictionary-keys-in-a-for-loop-with-d-items) for a similar example related to dictionaries in Python.
|
||||
* 参考这个StackOverflow的[回答](https://stackoverflow.com/questions/45946228/what-happens-when-you-try-to-delete-a-list-element-while-iterating-over-it)来解释这个例子
|
||||
* 关于Python中字典的类似例子, 可以参考这个Stackoverflow的[回答](https://stackoverflow.com/questions/45877614/how-to-change-all-the-dictionary-keys-in-a-for-loop-with-d-items).
|
||||
|
||||
---
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user