Будет ли остановлен поиск из списка на ele3?
Да, оператор in в списке выполняет линейный поиск с ранним выходом, если цель найдена. Кроме того, окончательное сравнение будет пропущено, если целевой объект идентичен объекту в списке.
Вот некоторый код трассировщика, который подтверждает результат, делая сравнения видимыми:
class Int(int):
'Make comparisons visible'
def __cmp__(self, other):
print 'Comparing %s to %d' % (self, other)
return int.__cmp__(self, other)
ele1 = Int(1)
ele2 = Int(2)
ele3 = Int(3)
ele4 = Int(4)
ele5 = Int(5)
alist = [ele1, ele2, ele3, ele4, ele5]
if ele3 in alist:
print "found"
Результат:
Comparing 3 to 1
Comparing 3 to 2
found
Python переводит оператор in в выражении ele3 in alist
в магический вызов метода например alist.__contains__(ele3)
. Метод list.__contains__() работает как это:
def __contains__(self, target):
for element in self:
if target is element or target == element:
return True
return False
Надеюсь, это сделает процесс кристально чистым :-)
person
Raymond Hettinger
schedule
06.08.2014