我试图按照以下方式实施(幼稚)quick_find_union
class QF(object):
def __init__(self,N):
self.id=[x for x in range(N)]
def connected(self,p,q):
assert type(p)==int
assert type(q)==int
return self.id[p]==self.id[q]
def union(self,p,q):
assert type(p)==int
assert type(q)==int
for x in self.id:
pid=self.id[p]
qid=self.id[q]
if x==pid:
x=qid
# for i in range(len(self.id)):
# pid=self.id[p]
# qid=self.id[q]
# if self.id[i]==pid:
# self.id[i]=qid
def show_array(self):
print self.id
if __name__=='__main__':
qf=QF(10)
qf.show_array()
print qf.connected(1,4)
qf.union(1,4)
qf.show_array()
print qf.connected(1,4)
返回
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False
但是当我在方法union中只使用注释掉的部分时 ,它按预期工作
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False
[0, 4, 2, 3, 4, 5, 6, 7, 8, 9]
True
为什么会这样?是否与迭代时尝试修改数组元素有关?我对此不太清楚。有人可以解释一下吗?
答案 0 :(得分:0)
x=qid
只需将名称x
重新绑定到名称qid
所引用的对象。它不会修改self.id
列表中的元素。
使用enumerate()
获取索引和值,并使用索引更新self.id
列表:
for i, x in enumerate(self.id):
pid=self.id[p]
qid=self.id[q]
if x==pid:
self.id[i]=qid