我有以下代码,我无法解释为什么它不能正常工作:
def make_complete_graph(num_nodes):
"""Makes a complete graph, showing all possible edges for a given number of nodes"""
ret={}
for num in range(num_nodes):
ret[num]=set([cnum for cnum in range(num_nodes) if cnum != num])
return ret
def random_graph(n, m):
ret=make_complete_graph(m)
for x in range(m,n):
ret[x]=set([random.choice(ret.keys()[:]) for x in range(m)])
return ret
具体来说,random_graph似乎不起作用。我的测试用例如下:
print random_graph(4,3) {0:set([1,2]),1:set([0,2]),2:set([1,2])}
出于某种原因,我似乎没有在字典中添加值。事实上,我似乎正在替换字典中的最后一个条目,而不是添加新值。
我添加了调试代码,将例程改为此,输出为:
def random_graph(n, m):
ret=make_complete_graph(m)
for x in range(m,n):
ret[x]=set([random.choice(ret.keys()[:]) for x in range(m)])
print x
print ret
print ret[x]
print ret.keys()
return ret
上一个测试用例的输出:
3
{0: set([1, 2]), 1: set([0, 2]), 2: set([0, 1])}
[0, 1, 2]
{0: set([1, 2]), 1: set([0, 2]), 2: set([0, 1, 2])}
我似乎正确设置了一个键(3),但是2的值是更新的。我在Windows 7上运行Python 2.7.2。这是一个错误,还是我做错了什么?
答案 0 :(得分:2)
只有一个局部变量' x',你已经将它用于两个目的 - 作为集合理解中的迭代器和周围循环中的迭代器。
如果它有帮助 - 理解本身不是范围,因为它可能在逻辑上是数学,它继承了本地范围。