for迴圈的本質
for迴圈的本質
-
是在對一個迭代器進行操作。首先for迴圈在遍歷可迭代物件的時候會把可迭代物件通過函式iter()或
__iter__
方法返回一個迭代器,然後在對這個迭代器物件進行操作。迭代器可以用next()或__next__
方法得到返回值,當把所有的值取完時會丟擲StopIteration錯誤,這個錯誤在for迴圈中python會自己處理,不會展示給開發者。 -
轉:在python中,使用iter函式可以獲得有序聚合型別的迭代器,我個人將迭代器理解為帶有next指標的單向連結串列,獲取到的迭代器為連結串列的表頭,表頭內容為空,next指標指向有序聚合型別的第一個元素。在訪問連結串列最後一個元素的next指標時,python會報錯StopIteration。 --------------------- 本文來自 jimmy_gyn 的CSDN 部落格 ,全文地址請點選:ofollow,noindex" target="_blank">https://blog.csdn.net/jimmy_gyn/article/details/79143682?utm_source=copy
-
如:
>>> a = [1,2,3,4] >>> b = iter(a) >>> b <list_iterator object at 0x0000016A7CF3A828> >>> next(b) 1 >>> next(b) 2 >>> next(b) 3 >>> next(b) 4 >>> next(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> for var in a: ...print(var) ... 1 2 3 4
-
反編譯for迴圈可以發現GET_ITER相當於iter()返回一個迭代器,FOR_ITER相當於next()遍歷並取出每一個值。
>>> import dis >>> x = [1,2,3] >>> dis.dis('for i in x: pass') 10 SETUP_LOOP12 (to 14) 2 LOAD_NAME0 (x) 4 GET_ITER >>6 FOR_ITER4 (to 12) 8 STORE_NAME1 (i) 10 JUMP_ABSOLUTE6 >>12 POP_BLOCK >>14 LOAD_CONST0 (None) 16 RETURN_VALUE
-
所以在for迴圈中對資料操作的的時候,就會出現各種異常。
-
比如for迴圈遍歷刪除,不會把一個列表刪除乾淨。
>>> for var in a: ...a.remove(var) >>> a [2, 4]
-
可以使用淺拷貝的方法刪除。
>>> c = a.copy() >>> for var in c: ...a.remove(var) >>> a []