双倍循环迭代.两个列表比较



我是初学者。

你能告诉我为什么这个脚本即使在ip not in i情况下没有定义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:Python27python.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

此时名称i仍然有效。它具有在for循环中分配的最后一个值。但是,没有必要在循环之后实际进行该if测试。Pythonforwhile循环采用可选的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 中,列表推导式在周围代码的范围内运行。

可以在官方教程中阅读有关作用域和命名空间的信息。


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

即使"i"变量没有在(ip不是i(的情况下定义?

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

最新更新