学习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
可见,该对象已经到了终点了,不能用了。