python - 更新 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)
解决方案
推荐阅读
- angular - Laravel 返回 SQLSTATE [23000]:违反完整性约束:1048 列“emp_id”
- java - FileUploadException:处理多部分/表单数据请求失败。连接因请求大于 10485760 而终止
- c# - 如何使用 Double 类型的值调整文本框的大小?
- reactjs - ReactJS路由器activeClassName问题
- spring-boot - 春季保险库返回状态 403 禁止 [秘密/数据/查询]:发生 1 个错误:* 权限被拒绝
- scala - 有没有办法在一次迭代中只将 a1 到 a10 输出插入到表中?
- apache-spark - 是否可以使用集群的全部资源运行多个 spark 文件?
- c - 两个带有指向彼此类型的结构的指针作为成员的结构?
- python - 条件移动平均线
- ios - 按钮未在collectionviewcell swift中显示