问题描述
问题
我生成一个chimera
图,它基本上是一个dwave_networkx
对象。 dwave_networkx
继承自networkx
图类。我将此存储在Python架子中。原始图的哈希值与从架子上检索到的哈希值不同,我不知道为什么。我要求两者都相同。
代码
import dwave_networkx as dnx
import shelve
def generate_graph(N):
graph = dnx.chimera_graph(1,N,4)
graph_id = ""
for node in graph.nodes:
graph.nodes[node]['weight'] = _get_node_weight() # A function that returns a random number
for edge in graph.edges:
graph.edges[edge]['weight'] = _get_edge_weight() # A function that returns a random number
graph_id = str(hash(graph))
return graph,graph_id
shelf = shelve.open("graphs.shelf")
ids = []
for i in range(10):
graph,id = generate_graph(5)
ids.append(id)
shelf[id] = {"graph": graph}
for i in ids:
print(i,hash(shelf[i]["graph"])
# The two values in each row turn out to be different!
shelf.close()
这可能是什么原因?
解决方法
可能是因为shelf
对象基本上是在创建原始图的副本。参见以下示例:
shelf = shelve.open("dummy.shelf")
# List are mutable,just like the Graphs
x = [1,2,3]
# Add the the list to shelf
shelf["1"] = x
print(id(x),id(shelf["1"]))
# 5314942976 5314799232
shelf.close()
如您所见,将创建原始列表的副本并将其添加到架子(类似于图,因为它们是可变类,所以发生了什么)。您可以查看implementation here了解更多信息。
参考: