这里发生了什么?Python for循环有多个in

 许婉玟秀贤 发布于 2023-02-13 22:57

我试图同时循环遍历两个列表,当它们的大小不同时没有意识到太多的麻烦.

然而,虽然在IDLE中摆弄,我发现这非常奇怪的输出.

这是Python 3.3.2

>>> for i in [1,2,3], j in [4,5,6]:
        print(i, j)


[1, 2, 3] 5
True 5

关于这一点很少,True有时会变为False,如下所示:

for i in [77,2,3], j in [588,7,6]:
    print(i, j)

[77, 2, 3] 5
False 5

并且5总是保持5.

这适用于两个语句,但有三个语句,它给了我这个:

>>> for i in [1,2,3], j in [4,5,6], k in [7,8,9]:
        print(i, j, k)


Traceback (most recent call last):
  File "", line 1, in 
    for i in [1,2,3], j in [4,5,6], k in [7,8,9]:
NameError: name 'k' is not defined

对我来说,这看起来很奇怪.

什么是5?真/假从何而来?为什么这样做......不是pythonic?您希望打印第一个代码:

1 4
2 5
3 6

编辑:我确实在脚本中有一个j = 5,在一个有效的for循环中.

第二次编辑:我其实并没有找 for i, j in zip(list1, list2)

我试图通过用一个替换两个for循环来缩短我的代码,但后来我意识到由于多种原因这是一个坏主意.

2 个回答
  • 你必须j=5在你的程序中定义这就是为什么你得到5作为输出,否则你的程序将引发NameError.

    >>> for i in [1,2,3], j in [4,5,6]:
                print(i, j)
    ...     
    Traceback (most recent call last):
      File "<ipython-input-1-b8d5b59be30b>", line 1, in <module>
        for i in [1,2,3], j in [4,5,6]:
    NameError: name 'j' is not defined
    
    >>> j = 5
    >>> for i in [1,2,3], j in [4,5,6]:
                print(i, j)
    ...     
    [1, 2, 3] 5
    True 5
    

    上面的循环相当于这两个:

    >>> for i in ([1,2,3], j in [4,5,6]):
                print(i, j)
    ...     
    [1, 2, 3] 5
    True 5
    >>> for i in ([1,2,3], True):
                print(i, j)
    ...     
    [1, 2, 3] 5
    True 5
    

    请注意,for循环中使用的变量会在循环结束后自动分配给最后一个值,但仅限于正常循环中(在Python 2.x中,这也适用于List comprehensions):

    >>> for m in range(5):
        print (m, end=' ')
    ...     
    0 1 2 3 4
    >>> m
    4
    

    要获得预期的输出用途zip:

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

    2023-02-13 23:09 回答
  • for i in [1,2,3], j in [4,5,6]:被解析为for i in ([1,2,3], j in [4,5,6]):,其中第一个infor ... in构造的一部分,第二个in是成员资格测试运算符.显然,以前执行的一些代码设置j为5并保持这种方式,所以自从j=5进入后[4,5,6],这就成了for i in ([1,2,3], True):.然后Python迭代这个两元素序列,设置i为first [1,2,3]然后True,然后j单独留下.在三语句版本中,会发生类似的解析,但由于k尚未在循环之前分配值,因此会导致错误.

    2023-02-13 23:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有