Python 3中的zip()函数
我知道如何在Python 3中使用Python 3中的zip()函数,python,Python,我知道如何在Python 3中使用zip()函数。我的问题是关于以下几点,我觉得有些奇怪: 我定义了两个列表: lis1 = [0, 1, 2, 3] lis2 = [4, 5, 6, 7] 我通过以下方式使用zip(): 1. test1 = zip( lis1, lis2) 2. test2 = list(zip(lis1, lis2)) 当我在解释器中键入test1时,我得到以下结果: "zip object at 0x1007a06c8" 因此,我在解释器中键入list(test
zip()
函数。我的问题是关于以下几点,我觉得有些奇怪:
我定义了两个列表:
lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]
我通过以下方式使用zip()
:
1. test1 = zip( lis1, lis2)
2. test2 = list(zip(lis1, lis2))
当我在解释器中键入test1
时,我得到以下结果:
"zip object at 0x1007a06c8"
因此,我在解释器中键入list(test1)
,得到预期的结果,但当我再次键入list(test1)
时,我得到一个空列表
我觉得奇怪的是,无论我在解释器中键入多少次test2
,我总是得到预期的结果,而且从来没有空列表。Python 3中的函数返回一个迭代器。这就是为什么打印test1
时会得到-
的原因-
制作一个迭代器,聚合来自每个ITerable的元素
但是一旦您执行了-list(test1)
,您就已经耗尽了迭代器。所以,在这之后,任何时候执行list(test1)
都只会导致空列表
对于
test2
,您已经创建了一次列表,test2
是一个列表,因此它将始终是该列表。与Python2不同,Python3中的zip
函数返回一个迭代器。迭代器只能使用一次(通过类似列出迭代器的方式)。这样做的目的是节省内存,只在需要时生成迭代器的元素,而不是一次将其全部放入内存。如果您想重用压缩对象,只需像在第二个示例中那样从中创建一个列表,然后通过以下方式复制该列表
test2 = list(zip(lis1,lis2))
zipped_list = test2[:]
zipped_list_2 = list(test2)
zip()
是一个生成器;它只生成一次值list()
创建任何iterable(包括生成器)的列表,因此您只需提取一次zip()
的值,并将结果列表存储在lis2
中。列表对象不是生成器,它们跟踪包含的所有值。在Python 3中稍微短一点:test2=[*zip(lis1,lis2)]
。并且test2=*zip(lis1,lis2),
将zip迭代器解压到元组中(Python 3)。这种行为不适用于生成器而不是迭代器吗?为什么不适用于迭代器?检查--每个生成器都是迭代器。迭代器也可能耗尽,同样的,也可能有一些生成器永远不会耗尽。