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时小心不要使用临时变量,不然的话会被清理导致不能正常的工作,不过我倒觉得具体是看怎么实现的就是了
浙公网安备 33010602011771号