以下是JS代码:
> m1 = new Map([['a', 1]])
Map { 'a' => 1 }
> m2 = new Map()
Map {}
> m2.set(m1, 3)
Map { Map { 'a' => 1 } => 3 }
> m2.get(m1)
3
但是请注意,这里基于身份(即===
)进行哈希运算,所以...
> m2.get(new Map([['a',1]]))
undefined
那么,这张地图真的有多有用呢?
请注意,这与Python的默认行为没有区别。用户定义类型的默认状态是可哈希的:
>>> class Foo: pass
...
>>> f0 = Foo()
>>> s = {f0}
>>> Foo() in s
False
>>> f0 in s
True
object.__eq__
是基于对象标识进行比较的,因此上述代码是可行的。但是,如果你重写了 __eq__
,默认情况下,__hash__
会被设置为 None
,并且在尝试使用哈希容器时会失败:>>> class Bar:
... def __init__(self, value):
... self.value = value
... def __eq__(self, other):
... return self.value == other.value
...
>>> b0 = Bar(0)
>>> b1 = Bar(2)
>>> {b0, b1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Bar'
此时,您必须实现__hash__
以保持一致性,并注意,虽然您的用户定义对象从未真正变得非常“不可变”
Map
,我发现如果你将一个 Map
作为键添加进去,它会接受,但是如果你尝试使用任何其他的 map 作为第一个 map 的键,它会给你第二个 map 的值。 就好像它只关心对象的类型而不是它的内容一样。这里到底发生了什么? - Ram Rachum