gpt4 book ai didi

java - 在 Java 中可以将列表添加到集合中,但在 Python 中则不行?

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:06 25 4
gpt4 key购买 nike

我是 Python 新手,只是偶然发现将 list 添加到 set 中。现在我知道了 reason为什么这是不可能的,因为 list 是可变的,因此它的 hashcode (或 Python 相应的概念)将会改变。反射(reflection)我的Java编程,我发现我已经这样做过很多次了。

HashSet<ArrayList<String>> masterCollection = new HashSet<ArrayList<String>>();
ArrayList<String> a = new ArrayList<String>();
masterCollection.add(a);
a.add("Hello, World");
for(ArrayList<String> list : masterCollection) {
// do something to list
}

我没有注意到上述代码有任何异常行为。我什至使用 ArrayList 作为 HashMap 的键并成功完成了我的任务。

所以我想问一下Python内部在这方面与Java有何不同,以及在编写上述代码时是否有需要注意的地方。

最佳答案

列表在Python中是不可散列的,因为它们没有定义__hash__。这是有原因的,但是您可以想象定义自己的可变类,前提是所述哈希在对象的生命周期内不会改变。例如,使用 id(x) 作为哈希。事实上,您可能在不知不觉中在您自己的许多类中准确地实现了这一点。

我将引用docs关于“可哈希”:

All of Python’s immutable built-in objects are hashable, while no mutable containers (such as lists or dictionaries) are. Objects which are instances of user-defined classes are hashable by default; they all compare unequal (except with themselves), and their hash value is their id().

可变性和散列性是耦合的,但根本不是一回事。

关于java - 在 Java 中可以将列表添加到集合中,但在 Python 中则不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24845926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com