【发布时间】:2021-01-16 23:07:35
【问题描述】:
我是一名 Python 开发人员,在 JavaScript 中迈出了第一步。
我开始使用Map 和Set。它们似乎与 Python 中的 dict 和 set 具有相同的 API,所以我假设它们是一个哈希表,我可以依靠 O(1) 查找时间。
但是,出于好奇,我试图看看如果我在 Chrome 的控制台中执行此操作会发生什么:
new Set([new Set([1, 2, 3])])
会发生什么:
Set(1) {Set(3)}
JavaScript 愉快地创建了集合。怎么会这样?在 Python 中你会得到一个错误,因为你不能把一个可变项放在一个集合或一个字典中。为什么 JavaScript 允许?
【问题讨论】:
-
因为 JS 允许你散列可变类型。这不是不可能,只是不够可取,Python 不允许你这样做。当然,在 Python 中,您可以定义自己的可变和可散列的自定义类型。但是,请注意,对象是按身份进行散列的,所以它不是非常危险,但它不是很有用。
-
JS 允许它,因为它允许它。请注意,Java 和 C# 还允许将可变项放入哈希桶中。当然,如果它们的哈希标识不稳定,这可能会导致问题,这可能是 Python 试图避免的,但是,JS 在这里肯定没有做任何不寻常的事情。事实上,在某些方面,JS 通过不允许对象的哈希标识改变来缓解一些问题——它始终是对象的引用,这避免了在对象被分类到一个哈希桶之后“丢失”对象的问题,然后更改,因此代码在另一个中查找它。
-
然后,这又会产生其他问题,因为您无法在没有实际拥有对象的情况下在哈希集中查找对象。自定义散列标识将允许您通过构造散列到相同值的东西来找到它。所以,这种方法有积极和消极的一面,但同样,它并没有任何异常。
标签: javascript python dictionary set hashtable