Python 对zip对象的列表执行len将清除zip

Python 对zip对象的列表执行len将清除zip,python,python-3.x,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

使用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>
>>> 
#蟒蛇3
Python 3.2.3(默认值,2012年9月30日,16:41:36)
[GCC 4.7.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>w=[11,22,33,44,55,66]
>>>x=[1,2,3,4]
>>>y=['a','b','c']
>>>z=zip(x,y,w)
>>>z
>>>名单(z)
[(1,'a',11)、(2,'b',22)、(3,'c',33)]
>>>len(列表(z))
0
>>>名单(z)
[]
>>>z
>>> 
谢谢,, Ahmed.

在Python 3中。执行
列表(z)
时,发电机正在耗尽。您可以根据生成器返回的值创建一个列表,并对其进行操作

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

这是件好事。它们允许我们以几乎与编写处理列表的代码相同的方式编写内存效率高的代码。要使用链接wiki中的示例,请执行以下操作:

def double(L):
    return [x*2 for x in L]
可以作为生成器重写,以避免在内存中创建另一个列表:

def double(L):
    for x in L:
        yield x*2

为了完成前面的回答,有一个名为cardinality的Python库,用于获取iterables的大小


http://cardinality.readthedocs.io/en/latest/

对于只使用Python3的人,在Python2.x中,zip将返回一个元组列表。感谢您添加它。另外,Python3的
zip()
与2.x的
itertools.izip()
工作原理类似。当然,您可以将
double
写成
double=(x*2表示L中的x)
True。wiki中还提到了生成器表达式替代方案。该示例过于简单,无法突出基于列表的方法和基于生成器的方法之间的差异(或缺乏差异),并且不打算在生产代码中使用。堆栈溢出对新手来说确实不友好。我认为PO的问题有其自身的价值,因为这里的关键点是Python3中的zip是生成器,我认为PO的问题不是完全重复的。