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

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