In generale potrebbe significare qualsiasi cosa . E 'stato già spiegato che cosa significa se x
è un list
o numpy.ndarray
, ma, in generale, dipende solo da come gli operatori di confronto ( <
, >
, ...) e anche come il get / set-item ( [...]
sono implementati -syntax).
x.__getitem__(x.__lt__(2))
x.__setitem__(x.__lt__(2), 0)
Perché:
x < value
è equivalente a x.__lt__(value)
x[value]
è (approssimativamente) equivalente a x.__getitem__(value)
x[value] = othervalue
è (anche approssimativamente) equivalente a x.__setitem__(value, othervalue)
.
Questo può essere personalizzato per fare tutto ciò che desideri. Proprio come un esempio (imita un po 'di indicizzazione numpys-booleana):
class Test:
def __init__(self, value):
self.value = value
def __lt__(self, other):
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 isinstance(item, Test):
res = self.__class__([i for i, index in zip(self.value, item) if index])
return res
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
Quindi ora vediamo cosa succede se lo usi:
>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2
Test ([True, False, False])
>>> a[Test([True, False, False])]
Test ([1])
>>> a[a < 2]
Test ([1])
>>> a[a < 2] = 0
>>> a
Test ([0, 2, 3])
Notare che questa è solo una possibilità. Sei libero di implementare quasi tutto ciò che desideri.