为什么代码在python2和python3中具有不同的行为?

时间:2020-03-31 14:12:37

标签: python

当我们使用python2运行以下代码时,结果为

[(1, 2), (2, 3), (3, 4)]
m: 1, n: 2
m: 2, n: 3
m: 3, n: 4

否则,使用python3

[(1, 2), (2, 3), (3, 4)]

我认为python3的结果没有道理吗?有人可以告诉我为什么吗?

a = [1, 2, 3]
b = [2, 3, 4]
c = zip(a,b)

print(list(c))

for (m,n) in list(c):
    print('m: {}, n: {}'.format(m, n))

2 个答案:

答案 0 :(得分:5)

在Python 3中,zip(以及其他一些功能,例如map)返回单次迭代器。所以,这是怎么回事:

  • 您定义了c = zip(a, b),但尚未评估c(这意味着ab上的迭代此时尚未发生)。
  • print(list(c))遍历c的元素,直到到达迭代器的末尾。 c现在“用尽了”:

    >>> a = [1, 2, 3]
    >>> b = [2, 3, 4]
    >>> c = zip(a,b)
    
    >>> print(list(c))
    [(1, 2), (2, 3), (3, 4)]
    
    >>> next(c)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
  • 看看呼叫next(c)如何提高StopIteration?这就是您第二次调用list(c)时发生的情况,因此它返回一个空列表:

    >>> list(c)
    []
    

解决难题的一种方法是立即(仅一次)将迭代器转换为列表:

a = [1, 2, 3]
b = [2, 3, 4]
c = list(zip(a,b))

print(c)

for (m,n) in c:
    print('m: {}, n: {}'.format(m, n))

答案 1 :(得分:0)

您的值c被迭代两次。在第一次打印时转换为列表一次,在for循环中第二次转换为列表。

在Python 2中,zip(a,b)返回一个列表,可以对其进行多次遍历。

在Python 3中,zip(a,b)返回一个zip对象,它是一个迭代器。第一次迭代该迭代器时,它会被有效地“用完”,并且在for循环运行时,它没有剩余的任何内容,因此循环体无法执行

相关问题