You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetworkX封装函数设置随机节点属性时所有图属性相同问题排查

错误原因

你的代码有两个核心问题,本质是对Python可变对象的引用逻辑、NetworkX图对象的特性不熟悉导致的:

  • 基础拓扑图G只在全局作用域创建了1次,initializeG()函数每次运行没有生成新图,只是反复修改这同一个全局图的节点属性
  • 循环执行masterG.append(G)时,列表存入的不是图的独立副本,而是同一个图对象的内存引用。10次循环往列表里放了10个指向完全相同内存地址的引用,等最后一次循环把G的属性改成最新随机值后,所有引用读出来的属性自然完全一致。

你手动拆分代码逐次运行时属性正常,是因为手动操作时你大概率每次都重新执行了G = nx.path_graph(4),相当于每次都新建了独立的图对象,不存在多个引用指向同一个可变对象的问题。

修正方案

每次生成新图时,先从固定拓扑模板拷贝出独立的新图实例,再给新实例设置随机属性,保证列表里存的10个图是完全独立的对象:

import numpy as np
import networkx as nx
from copy import deepcopy

masterG = []
# 预先定义固定不变的基础拓扑模板
base_G = nx.path_graph(4)

def randompicking(node_num, levels = ["High", "Medium", "Low"]):
    pick_res = np.random.choice(levels, node_num, replace=True, p=[0.33, 0.33, 0.34])
    return pick_res.tolist()

def initializeG():
    # 每次初始化深拷贝基础模板,生成独立的新图对象
    G = deepcopy(base_G)
    node_count = len(G.nodes)
    # 分别给新图设置随机节点属性
    expertise_level = dict(enumerate(randompicking(node_count)))
    innovation_level = dict(enumerate(randompicking(node_count)))
    nx.set_node_attributes(G, expertise_level, 'expertise_level')
    nx.set_node_attributes(G, innovation_level, 'innovation_level')
    return G

# 循环生成10张独立图
for i in range(10):
    masterG.append(initializeG())

修正后遍历masterG即可验证:每张图的边结构完全一致,节点属性都是独立随机分配的,不会出现全相同的问题。

内容的提问来源于stack exchange,提问作者Aman Kabra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:03:23