python中,map()对象,只能循环遍历一轮,之后为空的原因

学习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

可见,该对象已经到了终点了,不能用了。

 

posted on 2019-07-11 16:48  noox  阅读(2460)  评论(1编辑  收藏  举报

导航