python zip 函数解析

 1 def zip(*iterables):
 2     # zip('ABCD', 'xy') --> Ax By
 3     sentinel = object()
 4     iterators = [iter(it) for it in iterables]
 5     while iterators:
 6         result = []
 7         for it in iterators:
 8             elem = next(it, sentinel)
 9             if elem is sentinel:
10                 return
11             result.append(elem)
12         yield tuple(result)

 运行

a = [1, 2, 3, 4, 5, 6]
z = [iter(a)]*2
print zip(*z)

结果为 

[(1, 2), (3, 4), (5, 6)]

1、

由此可见 对迭代器对象再次进行迭代 返回的还是之前的迭代器对象

2、

list z 中两个元素指向的是同一个迭代对象

3、

因为z[0] 和 z[1] 指向的是同一个迭代器对象, 所以对z[0].next() 之后 z[1]指向的迭代器对象也向后走了一步

while iterators 无限循环

for it in iterators

  elem = it.next()

for 循环2次 相当于同一个迭代器对象每次while循环向后走两个 

所以结果为上  [(1, 2), (3, 4), (5, 6)]

 

posted @ 2018-01-24 12:09  听书人  阅读(124)  评论(0)    收藏  举报