为什么使用zip对象的列表推导会得到空列表?

7 投票
1 回答
5071 浏览
提问于 2025-04-15 12:37

在编程中,有时候我们需要把一些数据从一个地方传到另一个地方。这个过程就像是把水从一个水桶倒到另一个水桶一样。我们可以用不同的方法来完成这个任务,比如使用函数、变量或者其他工具。

有些时候,数据的传递可能会出现问题,就像水桶之间的水管堵了,水就流不过去了。这时候我们需要检查一下,看看是不是哪里出了错,或者需要换一种方法来传递数据。

总之,数据传递是编程中非常重要的一部分,理解它的工作原理可以帮助我们更好地解决问题。

f = lambda x : 2*x
g = lambda x : x ** 2
h = lambda x : x ** x
funcTriple = ( f, g, h )
myZip = ( zip ( funcTriple, (1, 3, 5) ) )
k = lambda pair : pair[0](pair[1])

# Why do Output # 1 (2, 9, 3125) and Output # 2 ( [ ] ) differ?

print ("\n\nOutput # 1:  for pair in myZip: k(pair) ...")
for pair in myZip :
    print ( k(pair) )

print ("\n\nOutput # 2:  [ k(pair) for pair in myZip ] ...")
print ( [ k(pair) for pair in myZip ] )

# script output is ...
# Output # 1:  for pair in myZip: k(pair) ...
# 2
# 9
# 3125
# 
# Output # 2:  [ k(pair) for pair in myZip ] ...
# []

1 个回答

18

在Python 2.6中运行得很好,但在Python 3.0中就不行了,因为zip返回的是一种生成器对象,第一次循环就把它用完了。你可以改成先生成一个列表:

myZip = list( zip ( funcTriple, (1, 3, 5) ) )

这样在Python 3.0中就可以正常工作了。

撰写回答