Python 范围对象不支持赋值
我一直得到一个TypeError“Range”对象不支持项分配。我试着稍微修改代码,比如在范围之前添加iter(…),以及在范围之前添加list(…)。但是,这没有帮助,错误还在继续。 代码如下:Python 范围对象不支持赋值,python,python-3.x,Python,Python 3.x,我一直得到一个TypeError“Range”对象不支持项分配。我试着稍微修改代码,比如在范围之前添加iter(…),以及在范围之前添加list(…)。但是,这没有帮助,错误还在继续。 代码如下: def findAnchor(anchors, node): start = node while node != anchors[node]: node = anchors[node] anchors[
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
def findAnchor(锚点、节点):
开始=节点
while节点!=锚定[节点]:
节点=锚点[节点]
锚点[开始]=节点
返回节点
def unionFindConnectedComponents(图形):
锚点=范围(长度(图表))
对于iter中的节点(范围(len(图)):
对于图[node]中的邻居:
如果邻居<节点:
持续
a1=findAnchor(锚、节点)
a2=findAnchor(锚、邻居)
如果a1
现在,TypeError位于锚点[start]=节点的开头。node是第二个函数的给定参数,其中表示iter中的node(range(len(graph)))。我用iter和list试过了,都没用。怎么办?anchors=range(len(graph))
在Python2中生成一个列表
,以便分配给它
但在Python3中,行为发生了变化range
成为一个惰性序列生成对象,这节省了内存和CPU时间,因为它主要用于循环计数,并且很少使用它生成连续的实际列表
发件人:
range不是一个函数,而是一个不可变的序列类型
这些对象不支持片分配([]
操作)
快速修复:在范围
对象上强制迭代,您将获得一个对象,您可以使用切片分配:
anchors = list(range(len(graph)))
archors=range(len(graph))
在Python2中生成一个列表
,以便您可以分配给它
但在Python3中,行为发生了变化range
成为一个惰性序列生成对象,这节省了内存和CPU时间,因为它主要用于循环计数,并且很少使用它生成连续的实际列表
发件人:
range不是一个函数,而是一个不可变的序列类型
这些对象不支持片分配([]
操作)
快速修复:在范围
对象上强制迭代,您将获得一个对象,您可以使用切片分配:
anchors = list(range(len(graph)))
哇,太棒了,谢谢!我一直在尝试使用“节点”,我认为错误就在那里,因为start=node。是的,对于iter中的节点(范围(len(图)):
iter
在这里是无用的。嘎!吹毛求疵,但它不会成为发电机的功能。它是一种不可变的、恒定内存的序列类型,支持延迟生成其值。它不是发电机。它甚至不是迭代器。如果你不相信我,试试r=range(10);接下来(r)
“范围对象”是一个明确的术语。再说一次,这只是一个吹毛求疵的问题,并不会影响你的回答。好吧,但对我来说,调用range
一个“range object”似乎是一个循环定义:)哇,太棒了,谢谢!我一直在尝试使用“节点”,我认为错误就在那里,因为start=node。是的,对于iter中的节点(范围(len(图)):
iter
在这里是无用的。嘎!吹毛求疵,但它不会成为发电机的功能。它是一种不可变的、恒定内存的序列类型,支持延迟生成其值。它不是发电机。它甚至不是迭代器。如果你不相信我,试试r=range(10);接下来(r)
“范围对象”是一个明确的术语。同样,这只是一个吹毛求疵的问题,并不会影响你的回答。好吧,但对我来说,调用range
一个“range object”似乎是一个循环定义:)所以在所有这些时间之后,建议的复制目标是100%相同的。。。在所有这些时间之后,sighso关闭了,建议的复制目标是100%相同的。。。叹息