相关疑难解决方法(0)

python如何计算元组的哈希值

在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)

似乎哈希计算的内容bc用于哈希计算.

我该如何理解这些例子?

python hash tuples

29
推荐指数
3
解决办法
5141
查看次数

将对象添加到python的集合集合中,并按对象的属性确定

我有一个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>}

python set

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

python ×2

hash ×1

set ×1

tuples ×1