jif*_*ifa 5 python membership collections set cmp
如果我理解正确,则会调用对象的__cmp __()函数,以便在确定对象是否为集合的成员或"in"时评估集合中的所有对象.但是,这似乎不是集合的情况:
class MyObject(object):
def __init__(self, data):
self.data = data
def __cmp__(self, other):
return self.data-other.data
a = MyObject(5)
b = MyObject(5)
print a in [b] //evaluates to True, as I'd expect
print a in set([b]) //evaluates to False
Run Code Online (Sandbox Code Playgroud)
那么对象成员资格如何在集合中进行测试呢?
向__hash__您的类添加方法会产生以下结果:
class MyObject(object):
def __init__(self, data):
self.data = data
def __cmp__(self, other):
return self.data - other.data
def __hash__(self):
return hash(self.data)
a = MyObject(5)
b = MyObject(5)
print a in [b] # True
print a in set([b]) # Also True!
Run Code Online (Sandbox Code Playgroud)
小智 2
>>> xs = []
>>> set([xs])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
你在这。集合使用哈希,与字典非常相似。这对性能非常有帮助(成员资格测试是 O(1),并且许多其他操作都依赖于成员资格测试),并且它也很好地符合集合的语义:集合项必须是唯一的,不同的项将产生不同的哈希值,而相同的哈希值表明(理论上)重复。
由于默认值__hash__是 just (恕我直言,这是相当愚蠢的),继承sid的类的两个实例永远不会散列到相同的值(好吧,除非地址空间大于散列)。object__hash__sizeof
| 归档时间: |
|
| 查看次数: |
1513 次 |
| 最近记录: |