【问题标题】:Hash of object changes before and after retrieving from Python shelf从 Python 架子检索之前和之后的对象哈希变化
【发布时间】:2021-01-07 22:01:15
【问题描述】:

问题

我生成了一个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()

这可能是什么原因?

【问题讨论】:

    标签: python-3.x dictionary hash persistence networkx


    【解决方案1】:

    这可能是因为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 发生的情况,因为它们是可变类)。您可以查看implementation here 了解更多信息。

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多