Двойной цикл для итерации.Сравнение двух списков - PullRequest
0 голосов
/ 11 мая 2018

Я новичок.

Не могли бы вы сказать мне, почему этот скрипт работает , хотя переменная i не определена в случае ip not in i?

Сценарий сравнивает список таблицы ARP match_data (которую я получаю по ssh-соединению paramiko) и мой список 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 голосов
/ 11 мая 2018

Имя i все еще действует в этой точке. Он имеет последнее значение, которое ему присвоено в цикле for. Однако на самом деле нет необходимости проводить этот if тест после цикла. Циклы 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 понимание списка выполняется в области действия окружающего кода.

Вы можете прочитать о областях и пространствах имен в официальном руководстве.


Кстати, вы должны серьезно подумать о переходе на Python 3, Python 2 достигнет своего официального конца жизни в 2020 году.

0 голосов
/ 11 мая 2018

, хотя переменная "i" не определена в случае (ip не в i)?

Это фактически определено - оператором for i in match_data.

...