網絡營銷資訊網站重慶網站推廣聯(lián)系方式
文章目錄
- 前言
- 一、range遍歷越索引現(xiàn)象
- QS1:遍歷range(2,2)會發(fā)生什么?不會報錯,但是也不會遍歷到任何內容
- QS1:遍歷range(3,2)會發(fā)生什么?不會報錯,但是也不會遍歷到任何內容
- 二、列表邊遍歷邊修改注意事項(Java的List系列集合使用 for-each 循環(huán)或 Iterator 遍歷集合時也會有下面問題)
- 1 避免直接修改列表長度:特別是邊遍歷邊append和pop元素
- 2 邊遍歷邊修改里面元素的值:這個是安全的,一般是結合enumerate 獲取索引一起遍歷
前言
一、range遍歷越索引現(xiàn)象
QS1:遍歷range(2,2)會發(fā)生什么?不會報錯,但是也不會遍歷到任何內容
for i in range(2,2):print(i) # 不會報錯,但是也不會輸出任何內容
answer:不會報錯,但是也不會遍歷到任何內容
QS1:遍歷range(3,2)會發(fā)生什么?不會報錯,但是也不會遍歷到任何內容
for i in range(3,2):print(i) # 不會報錯,但是也不會輸出任何內容
answer:不會報錯,但是也不會遍歷到任何內容
上面的這種range越索引不會報錯,也不會遍歷到內容,其實在遍歷的結尾出用到的非常頻繁
(1)range 函數本身不會引發(fā)索引越界錯誤,因為它生成的是一個惰性序列(在 Python 3 中),而不是直接生成一個完整的列表。
(2)range 生成的序列是動態(tài)計算的,只有在迭代時才會生成值。因此,即使你定義的 range 范圍不合理(比如 range(3, 2)),它也不會引發(fā)索引越界錯誤,而是直接生成一個空序列。
二、列表邊遍歷邊修改注意事項(Java的List系列集合使用 for-each 循環(huán)或 Iterator 遍歷集合時也會有下面問題)
1 避免直接修改列表長度:特別是邊遍歷邊append和pop元素
- 問題:遍歷時直接增刪元素會改變列表長度,導致索引錯位或跳過元素。
- 解決方案:
- 遍歷副本(保險還是深拷貝遍歷比較安全),修改原列表。
- 使用 enumerate 獲取索引
- 直接創(chuàng)建一個新的列表(使用列表推導式創(chuàng)建新列表),滿足條件的往這個里面加
- 直接使用 filter 函數過濾
2 邊遍歷邊修改里面元素的值:這個是安全的,一般是結合enumerate 獲取索引一起遍歷
lst = [1,3,2,2,6,7,9,2,3,6,2]for i,e in enumerate(lst):if e == 2:lst[i] = 4print(lst) # [1, 3, 4, 4, 6, 7, 9, 4, 3, 6, 4]