學習python,按照之前編程的思路,寫了如下代碼
A_object = map(str,range(3))
A_list = list(A_object)
B_list = list(A_object)
觀察A_list,其值為 ['1','2','3']
觀察B_list,其值為 []
也就是說,A_list獲取了一次A_object的值后, A_object就變為空了。
這是為何呢?
后來找了下資料,發現原因了。
這是由於,map函數返回的,是一個“可迭代對象”。
這種對象,被訪問的同時,也在修改自己的值。 類似於 a = a+1 ,這樣。對於map來說,就是每次訪問,都把自己變為List中的下一個元素。
循環取得對象中的值 ,實際上是會調用內部函數__next__,將值改變,或者指向下一個元素。
當多次調用,代碼認為到達終點了,返回結束,或者__next__指向空,此時可迭代對象(鏈表) 就算到終點了,不能再用了。
類似於 list(A_object) 或者 for num in A_object 這樣的語句,就是調用了迭代器,執行了__next__,消耗了迭代對象。所以,再次使用A_object后,會發現它已經空了。
實驗:
>>A_object = map(str,range(3))
>>num = A_object.__next__()
>>num
'0'
>>num = A_object.__next__()
>>num
'1'
>>A_list = List(A_object)
>>A_list
['2']
#此時,A_object已經指向最末尾,空元素了。再次調用next試試
>>num = A_object.__next__()
Traceback( most recent call last):
Filr "<stdin>" ,line 1 , in <module>
StopIteration
可見,該對象已經到了終點了,不能用了。