Имя 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 году.