首页 > 解决方案 > 更新 python 列表中的对象行为奇怪

问题描述

我有一个节点类,它有一个名为“邻居”的字段,它是一个列表。如果我找到一个比当前邻居更近的向量,我想更新这个列表。

在此代码片段中,我在循环内外打印单词及其邻居:

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")

但是邻居与我在循环内外打印时不同。

我得到这个输出(对于 10 个向量)。

循环内部:

go_VERB---------- 邻居:get_VERB

make_VERB------------ 邻居:get_VERB

get_VERB---------- 邻居:get_VERB

one_NUM---------- 邻居:know_VERB

see_VERB---------- 邻居:know_VERB

time_NOUN------------ 邻居:year_NOUN

take_VERB------------ 邻居:go_VERB

知道_VERB------------ 邻居:go_VERB

year_NOUN------------ 邻居:time_NOUN

循环外:

词:say_VERB
邻居:time_NOUN

词:go_VERB
邻居:time_NOUN

词:make_VERB
邻居:time_NOUN

词:get_VERB
邻居:time_NOUN

单词:one_NUM
邻居:time_NOUN

词:see_VERB
邻居:time_NOUN

词:time_NOUN
邻居:time_NOUN

词:take_VERB
邻居:time_NOUN

词:know_VERB
邻居:time_NOUN

词:year_NOUN
邻居:time_NOUN

我不知道该怎么做。我是 python 新手,所以有一些我不知道的列表行为吗?

这是我的代码:

类节点:

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

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

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

KNNGraph 类:

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)

标签: pythonnested-lists

解决方案


推荐阅读