从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()

如您所见,将创建原始列表的副本并将其添加到架子(类似于图,因为它们是可变类,所以发生了什么)。您可以查看implementation here了解更多信息。

参考:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...