Python范围对象不支持赋值

时间:2017-06-29 19:36:33

标签: python python-3.x connected-components

我一直得到一个TypeError'Range'对象不支持项目分配。我尝试稍微更改代码,如在范围之前添加iter(...),以及在范围之前的列表(...)。但是,它没有帮助,错误仍在继续。 这是代码:

def findAnchor(anchors, node):
    start = node                   
    while node != anchors[node]:   
        node = anchors[node]       
    anchors[start] = node          
    return node

def unionFindConnectedComponents(graph):
    anchors = range(len(graph))        
    for node in iter(range(len(graph))):    
        for neighbor in graph[node]:   
            if neighbor < node:        
                continue

            a1 = findAnchor(anchors, node)       
            a2 = findAnchor(anchors, neighbor)   
            if a1 < a2:                          
                anchors[a2] = a1                 
            elif a2 < a1:                        
                anchors[a1] = a2                 

    labels = [None]*len(graph)         
    current_label = 0                  
    for node in range(len(graph)):
        a = findAnchor(anchors, node)  
        if a == node:                  
            labels[a] = current_label  
            current_label += 1         
        else:
            labels[node] = labels[a]   


    return anchors, labels

现在TypeError位于anchors [start] = node的开头。并且node是来自第二个函数的给定参数,它表示iter中的节点(range(len(graph)))。我用iter和list尝试过,但都没有用。怎么办?

1 个答案:

答案 0 :(得分:4)

anchors = range(len(graph))在python 2中生成list,以便您可以分配给它。

但是在python 3中,行为发生了变化。 range成为一个懒惰的序列生成对象,它可以节省内存和数据。 CPU时间,因为它主要用于计算循环,它用于生成连续的实际list是相当罕见的。

来自documentation

  

范围实际上是一个不可变的序列类型

,而不是一个函数

此类对象不支持切片分配([]操作)

Quickfix:对range对象强制迭代,你将得到一个可以使用切片赋值的对象:

anchors = list(range(len(graph)))