python对象作为命令键
#编程 #教程 #python #性能

什么时候可以发生?
您有一个自定义类(对象),并且要将相关的元数据存储在内存中。您决定使用python dict并利用更快的查找o(1)。
对于用户对象:

user class

python dictous,eq和hash函数
对于用户对象,跟踪以后计算所需的点击次数。对象将是我们dict的关键,并且点击的数量将是值。在这种情况下,用户将不止一次进行对象。

>>> u1=User(1,"Jill")
>>> clicks=dict()
>>> clicks[u1]=1
>>> clicks
{<User(1 Jill)>: 1}
>>> u2=User(2,"Lock")
>>> clicks[u2]=2
>>> clicks
{<User(1 Jill)>: 1, <User(2 Lock)>: 2}
>>> u3=User(1,"Jill")
>>> clicks[u3]=3
>>> clicks
{<User(1 Jill)>: 1, <User(2 Lock)>: 2, <User(1 Jill)>: 3}

u1 andu3是同一用户的表示,jill具有相同的user_id 1,但是当创建u3a的值时,创建了新密钥。

这是因为Python使用对象ID来生成一个哈希,该哈希被用作dict中的键。u1and and u3具有不同的对象ID,因此尽管表示同一用户,但仍具有不同的字典键。



>>> id(u1)
140030203095248
>>> id(u3)
140030203095440
>>> 

 <User(1 Jill)>value需要对这种情况进行更新,因为它已经存在于字典中。 P>

user class with eq and hash
使用用户更新对象创建一个dict可以提供所需的输出。

>>> u1=User(1,"Jill")
>>> clicks=dict()
>>> clicks[u1]=1
>>> clicks
{<User(1,Jill)>: 1}
>>> u2=User(2,"Lock")
>>> clicks[u2]=1
>>> clicks
{<User(1,Jill)>: 1, <User(2,Lock)>: 1}
>>> u3=User(1,"Jill")
>>> clicks[u3]=3
>>> clicks
{<User(1,Jill)>: 3, <User(2,Lock)>: 1}
>>>

使用用户_id 1代表用户吉尔的对象u3 uttheclicksdict,更新dict u1中的现有对象,该对象是同一用户的rectresents。