字典似乎没有添加新密钥

时间:2014-09-01 00:29:35

标签: python dictionary

我有以下代码,我无法解释为什么它不能正常工作:

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。这是一个错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

只有一个局部变量' x',你已经将它用于两个目的 - 作为集合理解中的迭代器和周围循环中的迭代器。

如果它有帮助 - 理解本身不是范围,因为它可能在逻辑上是数学,它继承了本地范围。