只看楼主 #交流分享#-只能用一次
-
阅读:506 回复:2 2022-04-13 10:55:19
-
因为range filter reversed map等这些都返回迭代器吧,迭代器重要作用就是要用的时候才会去从中取数据,减少系统资源开销。所以迭代器都是一次性的,被迭代工具for in 等遍历使用一遍后,枪里子弹射完了就没了。
2022-04-13 14:29:43
-
正像颜老师说的,map(在python3.0以上)、reversed、filter这些方法返回的都是迭代器,
迭代器是一种用顺序方式访问一个聚合对象中各个元素的类,你可以把它想象成一个指针,或者说现实生活中的教鞭,它指到哪里就能访问哪里的数据。如下图所示,iterator在开始时指向第一个元素,每次通过找到当前指向的元素的next,实现顺序访问整个集合的功能。这个集合可以是有序的,也可以是无序的,换句话来说,用迭代器来顺序读取的时候,不用暴露以及在意该对象的内部数据结构。
因此当我们遍历这个迭代器时,它内部的代码实现大致为这样:
所以这也解释了为什么遍历完一遍迭代器,第二次遍历就失效了:因为遍历结束后,iterator指向了集合的最后一个元素,并且没有还原。第二次遍历的时候,iterator还指着最后一个元素呢,这最后一个元素也没有next(),所以抛出一个停止迭代的异常就直接结束了。
我因为好奇又看了下,迭代器在不断往下指的时候,自身的地址有没有发生变化,结果是没有发生变化的:
这就证明迭代器它是一个独立的量,它有自己的存储地址,而它的属性中一定包含了它所指向的地址,这个指向的地址和它自己的地址是要区分开来的。指向的地址会一直变化,而无论它迭代到哪里,迭代器本身的地址是不会发生变化的。
2022-04-13 17:16:13