Как исправить вывод для цикла в Python - PullRequest
1 голос
/ 31 мая 2019

У меня есть 3 маршрутизатора в моей тестовой лабораторной среде, я пытаюсь связаться с этими маршрутизаторами и отправить некоторые команды, используя for-loop, и отправить вывод так, как я их набираю / перечисляю.

У меня 3 1841 маршрутизатора Cisco и работает под управлением 12.4 IOS:

    multi_ip_addr = ['192.168.1.1', '192.168.2.1', '192.168.3.1']
    for ips in multi_ip_addr:
        pass
    len_ip_addr = len(multi_ip_addr)
    for len_ip in range(len_ip_addr):
        device = {'ip': ips, 
        'username': 'admin', 
        'password': 'password'}
        print(device)

Мой ожидаемый результат:

{'ip': '192.168.1.1', 'username': 'admin', 'password': 'password'} {'ip': '192.168.2.1', 'username': 'admin', 'password': 'password'} {'ip': '192.168.3.1', 'username': 'admin', 'password': 'password'}

однако я получаю этот вывод:

{'ip': '192.168.3.1', 'username': 'admin', 'password': 'password'} {'ip': '192.168.3.1', 'username': 'admin', 'password': 'password'} {'ip': '192.168.3.1', 'username': 'admin', 'password': 'password'}

Ответы [ 4 ]

2 голосов
/ 31 мая 2019

Вам необходимо вывести элемент из списка IP-адресов. Для этого используйте цикл for, а не диапазон:

for ip in multi_ip_addr:
    device = {
        'ip': ip,
        'username': 'admin',
        'password': 'password'
    }
    print(device)

Первый цикл for будет перезаписывать значение ips в каждом цикле, поэтому на самом деле к концу цикла ips равно последнему значению multi_ip_addr.

2 голосов
/ 31 мая 2019
multi_ip_addr = ['192.168.1.1', '192.168.2.1', '192.168.3.1']
for ips in multi_ip_addr:
    device = {'ip':ips, 'username':'admin', 'password':'password'}
    print(device)
1 голос
/ 31 мая 2019
for ips in multi_ip_addr:
    pass

При выполнении этого цикла ips принимает значение каждого элемента в multi_ip_addr.Когда цикл заканчивается, ips сохраняет значение последнего элемента.

В следующем цикле вы никогда не измените значение ips, поэтому оно каждый раз имеет одно и то же значение.

0 голосов
/ 31 мая 2019

Python определяет контекст с отступом, поэтому, если вы хотите использовать переменную ips для каждой записи, вам нужно сделать это в контексте for ips in multi_ip_addr (где у вас в данный момент есть только pass.) Я также могу изменить имя от ips до ip на вашем месте, просто чтобы прояснить ситуацию.

Вот как бы я переписал ваш цикл:

template_dict = {'ip' : None, 'username' : 'admin', 'password' : 'password'}
multi_ip_addr = ['192.168.1.1', '192.168.2.1', '192.168.3.1']

for ip in multi_ip_addr:
    print(template_dict.update({'ip' : ip})

Сравнение с JS:

Использование range(len(multi_ip_addr)) даст вам набор значений индекса, но это не нужно для того, чего вы пытаетесь достичь. Если вы знакомы с JavaScript: поведение цикла for по умолчанию в python похоже на использование шаблона for...of:

EX:

for (let i of <some_iterable>) {
    console.log(i);
}

будет эквивалентно:

for i in <some_iterable>:
    print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...