在python中,如果我有一个包含许多元素的元组,它的哈希值是根据元素的元素id
还是元素的内容计算的?
在这个例子中,
a = (1, [1,2])
hash(a)
Run Code Online (Sandbox Code Playgroud)
它错误地说列表是不可用的.所以我猜它不是由id计算的,或者可能是检查元素是否可变.
现在看这个例子
class A: pass
a0 = A()
ta = (1, a0)
hash(ta) # -1122968024
a0.x = 20
hash(ta) # -1122968024
Run Code Online (Sandbox Code Playgroud)
事实证明,散列ta
不随其元素的修改而改变,即a0
.那么也许a0
用于哈希计算的id?被a0
莫名其妙地认为是不可变的?python如何知道类型是否可变?
现在考虑这个案例
b = (1, 2)
id(b) # 3980742764
c = (1, 2)
id(c) # 3980732588
tb = (1, b)
tc = (1, c)
hash(tb) # -1383040070
hash(tc) # -1383040070
Run Code Online (Sandbox Code Playgroud)
似乎哈希计算的内容b
和c
用于哈希计算.
我该如何理解这些例子?
我有一个Person
这样的课:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return '<Person {}>'.format(self.name)
Run Code Online (Sandbox Code Playgroud)
我想将这个类的一些实例添加到一个集合中,如下所示:
tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)
person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>, <Person mary2>}
Run Code Online (Sandbox Code Playgroud)
如您所见,该组中有2个Marys.我怎样才能使Person
具有相同年龄的实例被认为是同一个人,并且只添加到一次?
换句话说,我怎样才能得到结果{<Person tom>, <Person mary>}
?