名师广场

登录
工作室首页 > 话题列表 > 话题详情

只看楼主 #交流分享#-只能用一次

  • 楼主

    顾杭林

    话题:38

    精华:0

    积分:194

    阅读:506 回复:2 2022-04-13 10:55:19

  • 2楼

    颜妙林

    话题:35

    精华:0

    积分:305

    因为range filter reversed map等这些都返回迭代器吧,迭代器重要作用就是要用的时候才会去从中取数据,减少系统资源开销。所以迭代器都是一次性的,被迭代工具for in 等遍历使用一遍后,枪里子弹射完了就没了。

    2022-04-13 14:29:43

  • 3楼

    王泽宇

    话题:25

    精华:0

    积分:107

          正像颜老师说的,map(在python3.0以上)、reversed、filter这些方法返回的都是迭代器,

          迭代器是一种用顺序方式访问一个聚合对象中各个元素的类,你可以把它想象成一个指针,或者说现实生活中的教鞭,它指到哪里就能访问哪里的数据。如下图所示,iterator在开始时指向第一个元素,每次通过找到当前指向的元素的next,实现顺序访问整个集合的功能。这个集合可以是有序的,也可以是无序的,换句话来说,用迭代器来顺序读取的时候,不用暴露以及在意该对象的内部数据结构。

    image.png

          因此当我们遍历这个迭代器时,它内部的代码实现大致为这样:

    image.png

          所以这也解释了为什么遍历完一遍迭代器,第二次遍历就失效了:因为遍历结束后,iterator指向了集合的最后一个元素,并且没有还原。第二次遍历的时候,iterator还指着最后一个元素呢,这最后一个元素也没有next(),所以抛出一个停止迭代的异常就直接结束了。

          我因为好奇又看了下,迭代器在不断往下指的时候,自身的地址有没有发生变化,结果是没有发生变化的:

    image.png

          这就证明迭代器它是一个独立的量,它有自己的存储地址,而它的属性中一定包含了它所指向的地址,这个指向的地址和它自己的地址是要区分开来的。指向的地址会一直变化,而无论它迭代到哪里,迭代器本身的地址是不会发生变化的。

    2022-04-13 17:16:13

说:

还能输入140发送

关闭

扫码登录更安全

空间登录

手机扫码,安全登录

二维码已失效 请点击刷新
请打开人人通空间APP扫一扫登录

手机扫码,安全登录

扫描成功!

请在手机上确认登录

取消二维码登录

二维码

名师工作室移动端

  • 扫一扫,直接在手机上打开
  • 随时随地使用工作室
分享
回到顶部