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
相关产品推荐
相关产品推荐

