В целом это могло бы означать ничего. Было уже объяснено, что это означает, что x
- это list
или numpy.ndarray
, но в целом это зависит только от того, как реализованы операторы сравнения (<
, >
, ...), а также как реализуются get/set-item ([...]
-syntax) ,
x.__getitem__(x.__lt__(2)) # this is what x[x < 2] means!
x.__setitem__(x.__lt__(2), 0) # this is what x[x < 2] = 0 means!
Потому что:
x < value
эквивалентно x.__lt__(value)
x[value]
является (примерно) эквивалентно x.__getitem__(value)
x[value] = othervalue
(также примерно), что эквивалентно x.__setitem__(value, othervalue)
.
Это может быть настроен, чтобы сделать что-нибудь вы хотите. Подобно тому, как пример (имитирует бит numpys-логическое индексирование):
class Test:
def __init__(self, value):
self.value = value
def __lt__(self, other):
# You could do anything in here. For example create a new list indicating if that
# element is less than the other value
res = [item < other for item in self.value]
return self.__class__(res)
def __repr__(self):
return '{0} ({1})'.format(self.__class__.__name__, self.value)
def __getitem__(self, item):
# If you index with an instance of this class use "boolean-indexing"
if isinstance(item, Test):
res = self.__class__([i for i, index in zip(self.value, item) if index])
return res
# Something else was given just try to use it on the value
return self.value[item]
def __setitem__(self, item, value):
if isinstance(item, Test):
self.value = [i if not index else value for i, index in zip(self.value, item)]
else:
self.value[item] = value
Итак, теперь давайте посмотрим, что произойдет, если вы используете его:
>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2 # calls __lt__
Test ([True, False, False])
>>> a[Test([True, False, False])] # calls __getitem__
Test ([1])
>>> a[a < 2] # or short form
Test ([1])
>>> a[a < 2] = 0 # calls __setitem__
>>> a
Test ([0, 2, 3])
Обратите внимание, это только одна возможность. Вы можете реализовать практически все, что хотите.
Не имеет смысла делать это со списком. – dbliss
Это имеет смысл только с массивами NumPy или подобными объектами, которые ведут себя совершенно иначе, чем поведение в ваших экспериментах, или поведение на основе списка, объясняемое в любом ответе. – user2357112
Обратите внимание, что это не работает в Python 3. Типы могут сравниваться только тогда, когда сравнение имеет смысл. В Python 3 этот пример вызывает 'TypeError: unorderable types: list()