问题引入:
同学在调试python代码的两个for循环遍历时发现输出有问题,因为遍历的有map()在,由于这个可迭代对象的出现,导致map()只能循环迭代一轮。
问题实质:
python中,map()对象,只能遍历一次,即从头遍历到尾,之后再遍历,只能得到为空的结果。
实例说明:
def scanD(D,CK,minSupport):
ssCnt = {}
s=list(CK)
pp = list(CK)
for tid in D:
print("###########")
print(tid)
print("##################")
for can in pp:
print("*******")
print(can)
print("*************")
D = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
#CK = [[1],[2],[3],[4],[5]]
#CK = [frozenset[1],frozenset[2],frozenset[3],frozenset[4],frozenset[5]]
temp = [[1],[2],[3],[4],[5]]
def scanD(D,CK,minSupport):
ssCnt = {}
for tid in D:
print("###########")
print(tid)
print("##################")
for can in CK:
print("*******")
print(can)
print("*************")
D = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
CK = [[1],[2],[3],[4],[5]]
scanD(D,CK,1)
简单来说进行,我们使用下面这个更短的代码段说明问题
CK = map(frozenset,[[1],[2],[3],[4],[5]])
s=list(CK)
pp = list(CK)
print(pp)
从上面代码段,可以看出,我们把map()对象的CK转换为list的对象,可以进行输出,各操作都很正常,但是当我们第二次使用map()对象进行list之后,再进行输出就只能为空了,这儿就说明了问题,第一次使用了map对象后,第二次再使用就没有了。只能得到空集合了。(这儿与之前我们学到的数组等类型不一样,我们需要注意一下)
问题原因:
map函数返回的是一个可迭代对象,这种对象在被访问的同时,也在修改自己的值。类似于a = a + 1,因此,对于map来说,就是每次访问,都把自己变为List中的下一个元素,循环取得对象中的值,实际上是会调用内部函数__next__,将值改变,或者指向下一个元素。当多次调用,代码认为到达终点了,返回结束,或者__next__指向空,此时可迭代对象(链表)就算到达终点了,不能用了。。
类似于list(A_object)或者for num in A_object这样的语句,就是调用了迭代器,执行了__next__,消耗了迭代对象。所以,再次使用A_object后,会发现它已经空了。
eg:
A = map(str,range(3))
num = A.__next__()
#num = A_object.__next__()
#print(A)
print(num)
print("*****")
B = A.__next__()
print(B)
C = A.__next__()
print(C)
print("&&&&")
D = A.__next__()
print(D)
我们运行,可以看到运行结果如下:原有的元素为0,1,2。我们依次进行了输出,并且也算是成功输出了,但是再进一步,输出下一个的时候,我们发现运行框中提示,停止迭代了。
总结
python中的map函数返回的是迭代器,python2中map函数返回的是list
(参考:https://www.cnblogs.com/stonenox/p/11171080.html)
转载:https://blog.csdn.net/yezonghui/article/details/101459869