在python中修改数组元素

时间:2013-02-06 04:48:24

标签: python algorithm iteration

我试图按照以下方式实施(幼稚)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

为什么会这样?是否与迭代时尝试修改数组元素有关?我对此不太清楚。有人可以解释一下吗?

1 个答案:

答案 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