@legand

Почему список очищается внутри словаря?

Почему если очистить список сразу после присваивания как значения словарю, тогда в словаре оказывается пустое значение, а если в начале итерации, тогда значения в словаре нормальные(не пустые)

access_dict = { 'FastEthernet0/12':10,
                'FastEthernet0/14':11,
                'FastEthernet0/16':17,
                'FastEthernet0/17':150 }

def generate_access_config(access, ps = False):
    config = []
    config_all = {}
    access_template = ['switchport mode access',
                       'switchport access vlan',
                       'switchport nonegotiate',
                       'spanning-tree portfast',
                       'spanning-tree bpduguard enable']

    port_security = ['switchport port-security maximum 2',
                     'switchport port-security violation restrict',
                     'switchport port-security']
    for intf in access: #Заминка в этом цикле
        config.clear() #Если список очищается тут, тогда значения нормальные, как в варианте 2
        for line in access_template: 
            if line.endswith('vlan') == True:
                config.append('{} {}'.format(line, access[intf]))
            else:
                config.append(line)
        if ps == True:
            config.extend(port_security)
        config_all[intf] = config
        #config.clear() #Если раскомментировать эту строку, тогда вывод будет как в варианте 1, т.е. не правильный.
    return(config_all)

print(generate_access_config(access_dict))


Вывод
1) {'FastEthernet0/12': [], 'FastEthernet0/14': [], 'FastEthernet0/16': [], 'FastEthernet0/17': []}
2) {'FastEthernet0/12': ['switchport mode access', 'switchport access vlan 150', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'], 'FastEthernet0/14': ['switchport mode access', 'switchport access vlan 150', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'], 'FastEthernet0/16': ['switchport mode access', 'switchport access vlan 150', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'], 'FastEthernet0/17': ['switchport mode access', 'switchport access vlan 150', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable']}
  • Вопрос задан
  • 173 просмотра
Решения вопроса 3
AnnTHony
@AnnTHony
Интроверт
Зачем объявлять config = [] пустым и потом снова очищать, и еще несколько раз?

def generate_access_config(access, ps = False):
    config_all = {}
    access_template = ['switchport mode access',
                       'switchport access vlan',
                       'switchport nonegotiate',
                       'spanning-tree portfast',
                       'spanning-tree bpduguard enable']

    port_security = ['switchport port-security maximum 2',
                     'switchport port-security violation restrict',
                     'switchport port-security']
    for intf in access:
        config = []
        for line in access_template: 
            if line.endswith('vlan') == True:
                config.append('{} {}'.format(line, access[intf]))
            else:
                config.append(line)
        if ps == True:
            config.extend(port_security)
        config_all[intf] = config
    return(config_all)
Ответ написан
Комментировать
@Animkim
Питон вокруг меня
Зачем везде '== True' лишнее сравнение. endswith возвращает True or False.
А по существу, все значение ключей это ссылка на один и тот же список.
Ответ написан
Комментировать
Все просто, тебе надо разобраться с типами объектов, как они сохраняются и как передаются.

#config.clear() #Если раскомментировать эту строку, тогда вывод будет как в варианте 1, т.е. не правильный.

Вывод будет правильный, так как в конце ты очищаешь объект, ссылка на который лежит в словаре.

== True
- это лишнее.

config.clear() #Если список очищается тут, тогда значения нормальные, как в варианте 2

Так тоже скорее всего не правильно, так как у каждого ключа в словаре будут одинаковые значения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы