在zip对象列表上执行len清除zip

Ahm*_*d A 11 python python-3.x

使用zip()函数时,我发现了一个奇怪的行为.当我执行以下操作len(list(z)),其中z是一个zip对象,结果为0(这对我来说似乎不对),并且该操作似乎清除了zip对象.有人可以帮我理解发生了什么.

# python3
Python 3.2.3 (default, Sep 30 2012, 16:41:36) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> w = [11, 22, 33, 44, 55, 66]
>>> x = [1, 2, 3, 4]
>>> y = ['a', 'b', 'c']
>>> z = zip(x, y, w)
>>> z
<zip object at 0x7f854f613cb0>
>>> list(z)
[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]
>>> len(list(z))
0
>>> list(z)
[]
>>> z
<zip object at 0x7f854f613cb0>
>>> 
Run Code Online (Sandbox Code Playgroud)

艾哈迈德,谢谢你.

ber*_*nie 12

在Python 3中,zip是一个生成器.当你这样做时,发电机正在耗尽list(z).您可以根据生成器返回的值创建列表并对其进行操作.

l = list(z)
len(l)
# -> 3
l
# -> [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]
Run Code Online (Sandbox Code Playgroud)

发电机是一件好事.它们允许我们编写内存高效的代码,几乎与编写处理列表的代码一样.要使用链接的wiki中的示例:

def double(L):
    return [x*2 for x in L]
Run Code Online (Sandbox Code Playgroud)

可以重写为生成器,以避免在内存中创建另一个列表:

def double(L):
    for x in L:
        yield x*2
Run Code Online (Sandbox Code Playgroud)

  • 对于只习惯Python 3的人来说,在Python 2.x zip中返回一个元组列表. (2认同)
  • 谢谢你补充说.Python 3的`zip()`也就像2.x的`itertools.izip()` (2认同)