Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3中的zip()函数_Python - Fatal编程技术网

Python 3中的zip()函数

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

我知道如何在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(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)。这种行为不适用于生成器而不是迭代器吗?为什么不适用于迭代器?检查--每个生成器都是迭代器。迭代器也可能耗尽,同样的,也可能有一些生成器永远不会耗尽。