Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 双循环迭代。两个列表比较_Python_Python 2.7_Loops_For Loop - Fatal编程技术网

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

Python 双循环迭代。两个列表比较,python,python-2.7,loops,for-loop,Python,Python 2.7,Loops,For Loop,我是初学者 您能否告诉我,即使i变量在ip而不是在i情况下没有定义,为什么该脚本仍能工作 脚本比较了ARP表match_data(我从paramiko ssh连接获得)列表和我的ip列表match_ip。我只想打印IP MAC,如果IP不在ARP列表表中,则打印IP+“无MAC地址” 输出 即使在(ip不在i中)情况下未定义“i”变量 它实际上是由match_data语句中i的定义的 此时名称i仍然有效。它具有在for循环中分配的最后一个值。但是,如果在循环之后进行测试,则实际上不需要进行测试。

我是初学者

您能否告诉我,即使
i
变量在
ip而不是在i
情况下没有定义,为什么该脚本仍能工作

脚本比较了ARP表
match_data
(我从paramiko ssh连接获得)列表和我的ip列表
match_ip
。我只想打印IP MAC,如果IP不在ARP列表表中,则打印IP+“无MAC地址”

输出 即使在(ip不在i中)情况下未定义“i”变量


它实际上是由match_data语句中i的
定义的

此时名称
i
仍然有效。它具有在
for
循环中分配的最后一个值。但是,如果在循环之后进行
测试,则实际上不需要进行
测试。Python
for
while
循环采用可选的
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语言密切相关的语言),新的块会创建新的作用域,但在Python中,普通的
for
循环不会这样做。Python在创建作用域方面比较保守,因为它们不像在C中那样“便宜”。函数定义会创建一个新的局部作用域,类定义也是如此。但是,生成器表达式确实在自己的范围内运行,Python 3中的列表理解也是如此,Python 2中的列表理解在周围代码的范围内运行

您可以在官方教程中阅读



BTW,您应该认真考虑迁移到Python 3,Python 2在2020的某个时间到达它的正式生命结束。< /P>请确认缩进是正确的。您所说的“i变量未定义”是什么意思?在Python中,您不声明变量,为什么您说“i”变量在<代码>中没有定义(IP不在i中)。

case”
i
仍然具有循环
末尾的值。因为,假设缩进是正确的,
i
in
if ip not in i:
i
中的最后一个值作为i in match_data:
i
对于这个变量来说是一个非常糟糕的名字,这就是为什么人们应该正确地命名变量,而不是在每个for循环中使用i和j的例子。最后一个“if”案例不是必须在“对于匹配_数据中的i”?@多佛循环不会在中创建作用域Python@Dover:取决于预期的结果,但这是另一个问题。请注意,如果希望它位于内部循环中,最好将其写成
else
子句。我只是理解为什么在“if-ip-in-I”下不需要“else”情况“作为一个替代动作=)为什么这里需要“break”这个词(没有break,脚本就不能正常工作)@Dover Python解释器知道
else
属于
for
,而不是前面的
if
因为缩进。因此,在使用
else
for
while
时,您需要非常小心,不要弄乱缩进!
中断
是必要的,因为当
for
终止时,否则控制将自动进入
else
块。另外,
break
使代码更高效,因为我们不想在找到匹配项后继续测试匹配项。
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
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'