大家。我正在使用Networkx 1.9模块在Python 2.7中编写一个简单的函数来测试我的图形分区算法实现是否正常工作。为此,我有一个列表dvecs,它有列表分区中每个块的列表,它提供有关每个节点到分区中类的边的信息。带上一只雄鹅:
#dvecs : list of len(P) lists which correspond to a list of degree vectors of each block
numBlocks = len(P)
dvecs = [[]] * numBlocks
for block in P:
blockNo = P.index(block)
dvecs[blockNo] = [[-1] * numBlocks] * len(block)
for node in block:
nodeNo = block.index(node)
for otherBlock in P:
otherBlockNo = P.index(otherBlock)
dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G, node)).intersection(set(otherBlock)))
我遇到的问题是,在嵌套循环的最后一行,以dvec [blockNo ...]开头的行,根据调试器,中间深度列表中的每个条目(具有由nodeNo指定的索引的那个)正在使用与最内层循环的每次迭代相同的值进行更新。换句话说,它好像是节点'保持不变,nodeNo遍历块中的所有节点。这是怎么回事?
为了回应罗马,我尝试了以下方法:
for blockNo, block in enumerate(P):
dvecs[blockNo] = [[-1] * numBlocks] * len(block)
for nodeNo, node in enumerate(block):
for otherBlockNo, otherBlock in enumerate(P):
dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G, node)).intersection(set(otherBlock)))
然而,我正在采取同样的行为。我错过了什么?
答案 0 :(得分:1)
此:
[[]] * n
为您提供一个包含相同空列表的列表,n
次。所以附加到其中任何一个人都会附加到" all"他们 - 只有一个嵌套列表。
试试这个,这将创建n
个不同的空列表:
[[] for _ in range(n)]