python-3.x - 从 Python 架子检索之前和之后对象的散列变化
问题描述
问题
我生成了一个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()
如您所见,创建了原始列表的副本并将其添加到架子(类似于 Graphs 发生的事情,因为它们是可变类)。您可以在此处查看实现以获取更多信息。
参考:
推荐阅读
- jenkins - Jenkins 主动选择参数,如何使用 groovy 执行 aws shell 命令
- javascript - 将复选框添加到表格
- .htaccess - 如何在 .htaccess 文件中返回斜杠?
- javascript - 我无法获取键码来匹配数组中的值
- sql - How to transform select statement to output with multiple columns
- c# - Razor 将单选框绑定到 SelectListItem 列表
- drop-down-menu - 在 mat-select 上设置选项选择以在选择后返回占位符
- newman - 如何从纽曼捕获响应体
- excel - 使用单个数字用户输入作为范围结束
- c - 当没有参考价值时,它会永远存在吗?