今天在使用python map的过程中,发现了一个奇怪问题,map遍历完成后,再次访问map,发现map为空了,特记录下来,以备日后查看。
如下代码,期望的结果是每次从外循环进入内循环,map都从头开始进行遍历,但事实却不是这样,下面为代码:
outData = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
outDataMap = map(set, outData)
data = [[1],[2],[3],[4],[5]]
dataMap = map(set, data)
for outElem in outDataMap:
print('outElem:', outElem)
for innElem in dataMap:
print('innElem:', innElem)
实际执行结果是:
outElem: {1, 3, 4} innElem: {1} innElem: {2} innElem: {3} outElem: {2, 3, 5} outElem: {1, 2, 3, 5}
期望结果是:
outElem: {1, 3, 4} innElem: {1} innElem: {2} innElem: {3} outElem: {2, 3, 5} innElem: {1} innElem: {2} innElem: {3} outElem: {1, 2, 3, 5} innElem: {1} innElem: {2} innElem: {3}
产生这种差异的原因在于:遍历完最后一个元素后,再次访问时会放回空列表
为了能持续正确的访问数据,需要将map list comprehension之后存在另外一个变量中。
正确代码如下:
outData = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5]]
outDataMap = map(set, outData)
data = [[1],[2],[3]]
dataMap = map(set, data)
dataList = list(dataMap)
for outElem in outDataMap:
print('outElem:', outElem)
for innElem in dataList:
print(' innElem:', innElem)