双循环迭代。两个列表比较

时间:2018-05-11 11:21:29

标签: python python-2.7 loops for-loop

我是初学者。

你能告诉我为什么这个脚本可以正常工作,即使i案例中ip not in i变量没有定义吗?

该脚本比较ARP表match_data(我从paramiko ssh连接获得)和我的IP列表match_ip的列表。我只想打印IP MAC,如果IP不在ARP列表中print ip + "NO MAC ADDRESS"

for ip in match_ip:
    for i in match_data:
        if ip in i:
            print  re.search((ip+'\s+'),i).group(0),mac.search(i).group(0)
            break
    if ip not in i:
        print ip + '           NO MAC ADDRESS'

输出

C:\Python27\python.exe C:/Python2/Get_mac_from_arp.py
!!!Connecting SSH!!!
10.240.184.103           30e4.db80.b699
10.240.184.104          7c2f.802d.61e5
10.240.184.105          7c2f.8072.40fc
10.240.184.106          e05f.b982.5720
10.240.178.11           NO MAC ADDRESS
10.240.184.177          e05f.b982.5752
10.240.184.178          7c2f.802a.782a
10.240.184.179          30e4.db80.b6ec
10.240.184.180          7c2f.802a.782b

Process finished with exit code 0

2 个答案:

答案 0 :(得分:1)

  

即使在(ip not in i)情况下没有定义“i”变量?

实际上是由for i in match_data语句定义的。

答案 1 :(得分:1)

此时名称i仍然有效。它具有在for循环中分配的最后一个值。但是,在循环之后不需要实际进行if测试。 Python forwhile循环采用可选的else子句,如果循环正常终止,则会输入该子句,即由于break语句而未提前退出(或return声明。

因此我们可以将该代码重写为:

for ip in match_ip:
    for i in match_data:
        if ip in i:
            print  re.search((ip+'\s+'),i).group(0),mac.search(i).group(0)
            break
    else:
        # We can only get here if the `break` didn't happen
        print ip + '           NO MAC ADDRESS'

我认为你期望一个for循环来创建一个新的作用域,循环索引和在循环中创建的其他变量只存在于该作用域中。在某些语言中(特别是那些与C密切相关的语言),一个新的块创建了一个新的范围,但在具有普通for循环的Python中并不会发生这种情况。 Python在创建范围时更为保守,因为它们并不像“便宜”而那样。在C中执行操作。函数定义创建新的本地范围,类定义也是如此。但是,生成器表达式 在其自己的作用域中运行,Python 3中的列表解析也是如此,在Python 2中,列表解析在周围代码的范围内运行。

您可以在官方教程中阅读scopes and namespaces

顺便说一句,你应该认真考虑迁移到Python 3,Python 2在2020年的某个时候达到其正式的生命终结。