Извиняется, если кто-то уже обращался к этому, но я не смог найти ответ.Python: __cmp__ и членство в списке тестирования
У меня есть проблема, когда я отменяю __cmp__
для пользовательского класса, похожую на этот:
class MyClass(object):
def __init__(self, prop):
self.prop = prop
def __cmp__(self, other):
return cmp(self.prop, other.prop)
a = MyClass(1)
b = MyClass(2)
c = MyClass(3)
d = MyClass(1)
my_list = [a, b, c]
print a in my_list
print b in my_list
print c in my_list
print d in my_list
# Output:
#
# True
# True
# True
# True
Чтение документации говорит мне, что это, как ожидается, потому что:
Для списка и tuple, x в y истинно тогда и только тогда, когда существует индекс i такой, что x == y [i] истинно.
Мой вопрос два раза:
- Почему Python (2.7) использовать
==
вместоis
, чтобы проверить членство в списке? - Есть ли лучший способ сделать это, чтобы я мог проверить, действительно ли конкретный экземпляр моего класса находится в контейнере и, чтобы сравнить экземпляры на основе их атрибутов?
В списке содержится значение, равное переменной, а не ссылка на переменную. –
На самом деле я добавил 'print a is my_list [0]; print d является my_list [0] 'и получил' True' и 'False' соответственно.Разве это не означает, что он содержит сам экземпляр? –
Да, см. Мой ответ для большего. –