函数返回带有networkx元素的列表

时间:2014-04-19 21:57:14

标签: python networkx

道歉,如果这是一个明显的错误 - 我是一个Python新手。无论如何,我正在使用Python中的NetworkX包生成一系列图形。基本上我正在做的是通过优先附件将图形增加到“n”个顶点,但保存每个“切片”。我的代码如下所示:

# function to generate a sequence of barabasi-albert random graphs
import networkx as nx

def pa_graph_seq(n, m, c=0, G=None, seed=None, seq=True):

    # Note: seq = True means function returns a list of
    #       networkx graph objects. Otherwise returns the
    #       graph from the final time slice

    # Some preliminary checks
    if m<1 or m>=n:
        raise nx.NetworkXError(\
            "BA network must have m>=1 and m<n, m=%d,n=%d"%(m,n))
    if seed is not None:
        random.seed(seed)
    if G is not None and len(G) >= n:
        raise nx.NetworkXError(\
             "G must have strictly less than n nodes")

    # If initial graph was not specified, initialize empty graph
    if G==None: G = nx.MultiGraph()

    # If seq==True, initialize the list with the initial graph
    if seq==True: Gseq = [G]

    # Grow the graph
    step = len(G)+1
    while step <= n:
        # Add a single node
        G.add_node(1)

        # Add edges
        for i in range(m):
            # Get degree sequence of current graph
            deg = nx.degree(G)
            d = deg.values()       

            # Increment degree of new node by 1
            d[len(d)-1] = d[len(d)-1]+1        

            # Sample node and attach edge           
            newnode = deg_sample(d,c)
            G.add_edge(step,deg_sample(d,c))

        # If seq==True, append onto Gseq
        if seq==True: Gseq.append(G)

        step += 1

    # Next loop for debugging only
    for i in range(len(Gseq)):
        print nx.nodes(Gseq[i])

    if seq == True:
        return Gseq
    else:
        return G

我遇到的奇怪问题是最终的Gseq列表似乎只包含最终图表的n个副本。例如,小调试循环(# Next loop for...)中的输出如下所示:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

实际上第一个元素的长度应为0,第二个元素的长度为1,等等...(因为我们每次添加一个节点,根据优先附件)。对于任何人来说,我在这里犯的错误显而易见吗?我已经确认如果我只是在main for循环中添加print nx.nodes(G),那么输出看起来我想要它...

感谢您的帮助和耐心!

1 个答案:

答案 0 :(得分:1)

代码只会将G的引用附加到GSeq,而不会实际附​​加新的图形对象。要获得您想要的行为,请将if G==None: G = nx.MultiGraph()放在主循环中。

为了更好地理解python如何处理mutable vs immutable上的数据读取。

我认为

@markusian有正确的想法。 MultiGraph有一个copy method可以帮助你找到你想要的行为。尝试像

这样的东西
if seq==True: Gseq.append(G.copy())