Python 只允许不可变对象的哈希值。例如,
hash((1,2,3))
有效,但是
hash([1,2,3])
提出一个TypeError: unhashable type: 'list'
。请参阅Python 文档。但是,当我通过常用函数在 Boost.Python 中包装 C++ 类时boost::python::class_<>
,每个生成的 Python 类都有一个默认哈希函数,其中哈希值与对象在内存中的位置有关。(在我的 64 位操作系统上,哈希值是位置除以 8。)
当我向 Python 公开一个可以更改其成员的类时(任何可变数据结构,所以这是一种非常常见的情况!),我不想要一个默认的哈希函数,但想要一个调用来hash()
引发与TypeError
用户收到的 Python 自己的相同的调用可变数据类型。特别是,用户不应该意外地将可变对象用作字典键。如何在 C++ 代码中实现这一点?