【发布时间】:2013-11-26 04:04:00
【问题描述】:
我正在使用 python 2.7
考虑下面的sn-p代码(例子是人为的):
import datetime
class ScheduleData:
def __init__(self, date):
self.date = date
def __eq__(self, other):
try:
return self.date == other.date
except AttributeError as e:
return self.date == other
def __hash__(self):
return hash(self.date)
schedule_set = set()
schedule_set.add(ScheduleData(datetime.date(2010, 8, 7)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 8)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 9)))
print (datetime.date(2010, 8, 8) in schedule_set)
schedule_list = list(schedule_set)
print (datetime.date(2010, 8, 8) in schedule_list)
这个输出是出乎意料的(至少对我来说):
[08:02 PM toolscripts]$ python test.py
True
False
在第一种情况下,给定的日期在 schedule_set 中找到,因为我已经覆盖了 __hash__ 和 __eq__ 函数。
据我了解,in 运算符将检查集合的哈希和相等性,但对于列表,它只会遍历列表中的项目并检查相等性。
那么这里发生了什么?为什么我对列表schedule_list 上的in 的第二次测试失败了?
我是否必须覆盖列表的其他功能?
【问题讨论】:
-
为我工作.. Python 3.3 我想知道为什么。确认,它不适用于 Python 2.7
-
也尝试添加
__neq__。 -
@tcaswell,谢谢我已经尝试过并且应该提到它,但它不起作用 - 那些
__ne__、__neq__和__eq__函数似乎没有得到在第二种情况下调用。 -
比较
datetime.date(2010, 8, 8) == schedule_list[1]和schedule_list[1] == datetime.date(2010, 8,8)。你得到False,然后是True? -
错误。我相信问题出在课堂上。
标签: python list set contains equality