Мне нужно добавить атрибут к узлам на графике списка типов.
Каждый узел должен иметь свою собственную копию атрибута.
Мне нужно добавить этот атрибут после создания моего графа, потому что он не нужен, если функция, которая изменяет граф, никогда не вызывается.
Я пытался использовать функцию nx.set_node_attributes, но это дает каждому узлу атрибут, который я передаю функции по указателю.Таким образом, каждый узел указывает на один и тот же список, где то, что я хочу дать каждому узлу, является собственной копией (глубокой копией) списка.
import networkx as nx
G=nx.Graph()
G.add_node(1, attributelist = [])
G.add_node(2, attributelist = [ 'a', 'b', 6])
G.nodes(data=True)
nx.set_node_attributes(G,[],'TestList')
G.nodes[1]['TestList'].append('Value')
Я ожидаю, что вывод приведенного выше кода будетследует:
NodeDataView({1: {'attributelist': [], 'TestList': ['Value']}, 2: {'attributelist': ['a', 'b', 6], 'TestList': []}})
Но я получаю следующее:
NodeDataView({1: {'attributelist': [], 'TestList': ['Value']}, 2: {'attributelist': ['a', 'b', 6], 'TestList': ['Value']}})
Я вполне уверен, что это потому, что nx.set_node_attributes
только что дал каждому узлу указатель на атрибут с именем TestList
где, поскольку мне нужно, чтобы каждый узел имел свою собственную копию TestList
.
Вы можете видеть, что узлы выше имеют еще один атрибут с именем attributelist
.Этот атрибут ведет себя так, как я хочу.
Таким образом, добавление функции к attributelist
добавляет только добавленное значение к указанному узлу.
G.nodes[1]['attributelist'].append('Cat')
G.nodes(data=True)
NodeDataView({1: {'attributelist': ['Cat'], 'TestList': ['Value']}, 2:{'attributelist': ['a', 'b', 6], 'TestList': ['Value']}})