首页 文章

为什么逗号分隔的iterables不能像zip那样工作?

提问于
浏览
1

我想了解的是为什么以下代码

for x, y in [1,2], [3,4]:
    print(x, y, x + y)

版画

1 2 3
3 4 7

代替

1 3 4
2 4 6

现在,我知道zip工作和not using zip to iterate over a pair of lists could be considered an anti-pattern,但我仍然需要对此默认行为进行解释 .

从我的角度来看,上面的代码应该像内置的zip函数一样直观地工作

for (x, y) in zip([1,2], [3,4]):
    print(x, y, x + y)

打印

1 3 4
2 4 6

从内存中我记得很久以前就看过这种技术的解释了(我猜_16774已经完成了搜索,包括整篇Python 3文档的第5部分,但我找不到任何关于这种行为的解释,甚至没有找到section 5.6. (Looping Techniques) .

这是第4次Gotcha吗?

3 回答

  • 0

    理解第一种行为的直观方式是思考

    for x, y in [1,2], [3,4]:
    

    作为分解

    for z in [[1,2],[3,4]]:
    

    哪里

    z[0] = [1,2]
    z[1] = [3,4]
    
  • 6

    我认为这是预期的行为!
    考虑 [1,2], [3,4] 是一个元组文字,相当于元组 ([1,2], [3,4]) . (您可能在没有注意的情况下使用它,例如在使用 a, b, c = 10, 20, 30 分配多个值时忽略 () ...) .

    因此,在您的示例中,循环遍历此列表,如下所示:

    # First iteration we get:
    x, y = [1, 2]  
    # Which is the same as:
    x = 1
    y = 2
    # Which would print:
    print(x, y, x+y)
    >> 1, 2, 3
    
    # Second iteration we get:
    x, y = [3, 4]  
    # Which is the same as:
    x = 3
    y = 4
    # Which would print:
    print(x, y, x+y)
    >> 3, 4, 7
    

    这现在更有意义了吗?


    考虑zip:如果zip会做同样的事情,那么我'd be suspicious! How is there this very common and considered-useful but completely redundant thing lying around? Hasn'吨有人注意到了吗?所以你不应该指望他们这样做! ;-)

  • 0

    看这个:

    >>> [1,2],[3,4]
    ([1, 2], [3, 4])
    >>> list(zip([1,2],[3,4]))
    [(1, 3), (2, 4)]
    >>>
    

    结果是不同的,所以当你迭代时:

    for x,y in [1,2],[3,4]:
        ...
    

    它会是这样的:

    x=1
    y=2
    # next loop
    x=3
    y=4
    

    当循环是:

    for x,y in zip([1,2],[3,4]):
        ...
    

    它迭代如下:

    x=1
    y=3
    # next loop
    x=2
    y=4
    

    这就是Python创建 zip 方法的原因 .

相关问题