Пара комментариев:
Прежде всего, синтаксис понимания списка [expression for var in iterable]
создает копию. Если вы не хотите создавать копию списка, используйте выражение генератора (expression for var in iterable)
.
Как работают генераторы? По сути, путем многократного вызова next(obj)
для объекта, пока не будет сгенерировано исключение GeneratorExit
.
Судя по исходному коду, вам все равно нужен отфильтрованный список в качестве вывода.
Таким образом, вы можете эмулировать это с небольшой потерей производительности:
l = []
for obj in objlist:
try:
if not obj.mycond()
l.append(obj)
except Exception:
pass
Однако, вы можете перестроить все это с помощью функции генератора:
def FilterObj(objlist):
for obj in objlist:
try:
if not obj.mycond()
yield obj
except Exception:
pass
Таким образом, вы можете безопасно перебирать его, не кэшируя при этом список:
for obj in FilterObj(objlist):
obj.whatever()