1. 程式人生 > >python3 迴圈遍歷一次map之後,map為空

python3 迴圈遍歷一次map之後,map為空

今天在跟敲書本程式碼的時候,發現map型別的變數經過一次for迴圈遍歷之後,裡面的元素都沒有了,找了一些資料,特此記錄,以作備忘。

我們常常會寫類似於這樣的程式碼:

dataSet = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
num = 0
D = map(set,dataSet)
for tid in D:
    num += 1
SS = list(D)
print(SS)

我們通常想要的輸出會是這樣的:

但實際上是這樣的:

之所以會這樣,原因在於:遍歷完最後一個元素後,再次訪問時會放回空列表。我們也可以這樣理解:由於python中“沒有指標,但是所有物件均為指標”,完成一次遍歷後指標會移到最後一個元素上了。也就是說,D是一個map object,print(list(D))或者for迴圈列印D中的元素,都會導致迭代器

從頭走到尾(可以類比list[0]到list[n])。 而迭代器是一個單向的容器,走到尾部之後,不會自動再回到開始位置。 所以,對Map物件進行一次for迴圈之後,Map就相當於“空”了。

想要二次遍歷(訪問)Map物件,這裡有一種方法可供參考:

------在第一次遍歷Map物件之前,先複製拷貝一份,但此時的拷貝需要是深拷貝才行。

所以程式碼應該修改如下:

import copy
dataSet = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
num = 0
D = map(set,dataSet)
DD = copy.deepcopy(D)
for tid in D:
    num += 1
SS = list(DD)
print(SS)

在使用deepcopy函式之前,需引入copy模組。輸出結果如下:

至此,此問題就可以得到解決了。

方法參考: