Append заменяет все элементы списка на последний

Рейтинг: 0Ответов: 1Опубликовано: 19.01.2023

Есть такой блок кода

item_list = []
for ip in ip_list:
    # result = checkavailability(ip)
    item_list.append(checkavailability(ip))

При каждом цикле все элементы списка заменяются на последний

Первый цикл Первый цикл

Второй цикл Второй цикл

Помогите разобраться, что я сделал не так

Код

import time
import re
import socket
import json

class router:
    ip = None
    availability = None

def readFileToList(path): 
    iplist = open(path, 'r', encoding='utf-8').read()
    # iplist = re.findall('(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', iplist)
    return iplist

def checkavailability(ip):
    router.ip = ip
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout
    try:
        sockAnswer = sock.connect_ex((ip, 22))
        if sockAnswer ==0:
            router.availability=True
        else:
            router.availability=False
    except:
        router.availability=False
        print(router.ip, 'Device not found')
    return router


ip_list = readFileToList('ip.txt')
ip_list = re.findall('(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', ip_list)
print(ip_list)
cmd_list = readFileToList('cmd.txt').splitlines()
item_list = []
for ip in ip_list:
    # result = checkavailability(ip)
    item_list.append(checkavailability(ip))

Ответы

▲ 2Принят

Это логическая ошибка. В функции checkavailability вы меняете статические переменные класса router и возвращаете класс. Чтобы это исправить нужно создавать объект класса и добавлять в список его.

class Router:
    def __init__(self, ip, availability):
        self.ip = ip
        self.availability = availability

# функцию readToList можно не менять

def checkavailability(ip):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout
    try:
        sockAnswer = sock.connect_ex((ip, 22))
        if sockAnswer==0:
            availability = True
        else:
            availability = False
    except:
        availability = False
        print(ip, 'Device not found')
    return Router(ip, availability)

# остальной код тоже можно не менять

Теперь сделаем, чтобы человек мог прочитать вывод объектов класса Router:

class Router:
    def __init__(self, ip, availability):
        self.ip = ip
        self.availability = availability

    def __repr__(self):
        return f'Router({self.ip}, {self.availability})'

    def __str__(self):
        if self.availability:
            return f'{self.ip} available.'
        return f'{self.ip} is not available.'

Вот этот кусок:

if sockAnswer==0:
    availability = True
else:
    availability = False

Можно записать короче:

availability = not sockAnswer