1.

在python中凡是实现了iter()的类都是可迭代对象,可以通过iteration对其进行迭代

2.

从抽象的角度来讲,可迭代对象有一个被称作是入口的东西

而每次调用iteration时,会生成一个迭代器对象,由于是对象,所以每次生成时的地址都不固定

譬如:

iter(a)

iter(a)

每次都是重新生成的对象,并且会刷新,重置状态,这会导致next读取的都是第一个

因此我们需要这样写:

b=iter(a)

来保证b本身没有被释放,是一个不变的对象,从而保存自己的状态

在iteration函数中,setstate可以设置一个状态,使得迭代器从这个状态开始,这就表示其使用了这个状态

3.

iteration的释放问题

iteration的释放取决于是否需要新建一个iteration迭代器对象,而这更取决于iter()函数自身的实现,如果实现的是临时变量且每次重新建立一个新类,即没有引用的变量,其在不同编译器中有不同解释,但是不管是哪种,都会清空其状态

而如果这个iter()函数返回的是可迭代的本身(实现了next)的自己,那么由于自身是在之前被形如a=class()之类的方法被定义了的,所以有了引用,之后每次使用都不会重新建立一个新类,这就是实现本身的问题

在python中,如果事先用a=iter(b)这种写法占用一个位置的话,那么之后的iteration便不会分配到a上

而如果是使用

print(iter(a))

print(iter(a))

print(iter(a))

print(iter(a))

之类写法,对于有些编译器,会直接把之前的位置释放掉,再更新一个新的iter,但是会占据原来的位置,而对于有些编译器,会一直使用这个位置,但是类还是新的

而之所以被释放掉,就取决于之前的引用/回收机制,因为你一直没人引用,python就自动给你回收了,但是是过了一会儿,不是直接

4.

自建迭代器

使用的还是iter和next的实现

其中iteration需要返回一个迭代器,里面指向一个实现了next的对象

譬如

def __iter__(self)

  return [1,2,3,4].__iter__()

就实现了一个指向了[1,2,3,4]的迭代器,由于实现不同,在有的编译器中,如果重复执行有的会释放掉原id,有的不会而是延续原来的id,但是不管什么时候,如果返回的是自己的话那么就只会返回同一个id,因为自己是已经实现了的

5.

iterator必须同时实现iteration与next,其中iteration可以返回其他iteration也可以返回自己作为对象,返回其他iteration时小心不要使用临时变量,不然的话会被清理导致不能正常的工作,不过我倒觉得具体是看怎么实现的就是了

posted on 2022-09-11 11:40  mitudesk  阅读(40)  评论(0)    收藏  举报