Обновление объектов в списках python ведет себя странно - PullRequest
1 голос
/ 17 февраля 2020

У меня есть класс Node, у которого есть поле с именем 'соседей', которое является списком. Я хочу обновить этот список, если найду вектор, более близкий к тем, которые в настоящее время находятся у соседей.

В этом фрагменте кода я печатаю слово и его соседей внутри и вне l oop:

def create_knn(self, k):
    nodes = copy.deepcopy(self.nodes)
    for i in range(len(nodes)):
        for y in nodes:
            if (nodes[i].word == y.word):
                continue
            self.nodes[i] = self.update_neighbours(nodes[i], y, k)

        #print temp
        print(self.nodes[i].word + "----------------------------------")
        for j in self.nodes[i].neighbours:
            print("neighbour: " + j.word)
        print("\n")

    #print temp
    for i in self.nodes:
        print("word: " + i.word)
        for j in i.neighbours:
            print("neighbour: " + j.word)
        print("\n")

Но соседи отличаются от того, когда я печатаю внутри и снаружи l oop.

Я получаю этот вывод (для 10 векторов).

Внутри l oop:

go_VERB ----------- --- сосед: get_VERB

make_VERB ------------ сосед: get_VERB

get_VERB ------------- сосед: get_VERB

one_NUM -------------- сосед: знаю_ВЕРБ

see_VERB ------------- сосед: знаю_ВЕРБ

time_NOUN ------------ сосед: year_NOUN

take_VERB ------------ сосед: go_VERB

know_VERB- ----------- сосед: go_VERB

year_NOUN ------------ сосед: time_NOUN

За пределами l oop:

слово: say_VERB
сосед: time_NOUN

слово: go_VERB
сосед: time_NOUN

слово: make_VERB
сосед: time_NOUN

слово: get_VERB
сосед: time_NOUN

слово: one_NUM
сосед: time_NOUN

слово: see_VERB
сосед: time_NOUN

word: time_NOUN
neig hbour: time_NOUN

слово: take_VERB
сосед: time_NOUN

слово: know_VERB
сосед: time_NOUN

слово: year_NOUN
сосед: time_NOUN

Понятия не имею, что делать. Я новичок в python, так есть ли какое-то поведение списков, которых я не знаю?

Это мой код:

Класс Node:

word = ""
vector = []
neighbours = []

def __init__(self, word, vector):
    self.word = word
    self.vector = vector

def __eq__(self, other):
    return self.word == other.word

класс КННГраф:

nodes = []

def create_knn(self, k):
    nodes = copy.deepcopy(self.nodes)
    for i in range(len(nodes)):
        for y in nodes:
            if (nodes[i].word == y.word):
                continue
            self.nodes[i] = self.update_neighbours(nodes[i], y, k)

        #print temp
        print(self.nodes[i].word + "----------------------------------")
        for j in self.nodes[i].neighbours:
            print("neighbour: " + j.word)
        print("\n")

    #print temp
    for i in self.nodes:
        print("word: " + i.word)
        for j in i.neighbours:
            print("neighbour: " + j.word)
        print("\n")

def update_neighbours(self, x, y, k):
    prod = self.calculate_inner_product(x, y)
    min_prod = prod
    min_n = copy.deepcopy(x)

    for n in x.neighbours:
        if (n.word == y.word):
            return
        n_prod = self.calculate_inner_product(x, n)
        if (n_prod < min_prod):
            min_prod = n_prod
            min_n = n

    if (len(x.neighbours) < k):
        x.neighbours.append(y)
    elif ((len(x.neighbours) >= k) and (min_prod < prod)):
        x.neighbours.remove(min_n)
        x.neighbours.append(y)
    return x

def calculate_inner_product(self, x, y):
    return np.inner(x.vector, y.vector)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...