Pakonigoosy
@Pakonigoosy
Разработчик ПО

Почему массивы как бы копируются?

Есть такой код:
def sgn(x):
    if x>0:
        return 1
    elif x<0:
        return -1
    else:
        return 0
class Sensor:
    state=0
    def set(self,x):
        self.state=x
class Associative:
    weights=[]
    teta=0
    state=0
    def run(self,sensors):
        summ=0
        for sensor in range(len(sensors)):
           summ+=sensors[sensor].state*self.weights[sensor]
        #print(summ,self.teta)
        if summ>self.teta:
            self.state=1
        else:
            self.state=0
class Reacting:
    teta=0
    def run(self,x,w):
        return sgn(sum([w[i]*x[i].state for i in range(len(w))])-self.teta)
class OLRB:
    weights=[]
    def __init__(self,sensors,associatives):
        self.sensors=[Sensor()]*sensors
        self.associatives=[Associative()]*associatives
        self.reacting=Reacting()
        
    def run(self,x):
        for sensor in range(len(self.sensors)):
            self.sensors[sensor].set(x[sensor])
        for associative in range(len(self.associatives)):
            self.associatives[associative].run(self.sensors)
        return self.reacting.run(self.associatives,self.weights)

Это основной код. Здесь реализуется персептрон
А вот код, который я пытаюсь использовать для инициализации его перед обучением (расставить веса S-A связей, пороги)
def EC_prepare(p):
    while 1:
        done=[0]*len(p.sensors)
        for i in range(len(p.associatives)):
            p.associatives[i].teta=random.randint(0,len(p.sensors))
            p.associatives[i].weights=[]
            for q in range(len(p.sensors)):
                p.associatives[i].weights.append(random.randint(-1,1))
                
                if (p.associatives[i].weights[q]!=0):
                    done[q]+=1
            print(p.associatives[i].weights)
            #эта команда выводит веса i-того ассоциативного элемента
        if done.count(0)==0:
            print(p.associatives[0].weights)
            break
        else:
            print('-'*32)
    
    p.weights=[0]*len(p.associatives)
    return p

Выполняю я следующую тестовую программку:
olrb=OLRB(2,2)
olrb=EC_prepare(olrb)

Я заметил, что у ассоциативных элементов постоянно полностью совпадают все параметры (веса и порог)
Сначала я думал, что это случайность, но после 5 повторений решил все же проверить.
Проблема в функции EC_prepare, которая проводит первоначальную инициализацию персептрона. Сначала я проверяю веса сразу после их заполнения и тут все в порядке. Но когда я проверяю веса первого ассоциативного элемента уже после заполнения второго, оказывается, что у первого и у второго элемента веса совпадают. Что это за неявное копирование?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
У вас у классов все объявленный поля - переменные класса, а не объекта. Они общие для всех классов. Объявите/инициализируйте поля в __init__ с указанием self.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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