В случае, если из других ответов не ясно, ваша проблема заключается в следующем:
if (x for x in NL if x < sc.NLayer):
В этом синтаксисе вы создали так называемое выражение генератора , котороекак понимание списка, но вместо этого он возвращает генератор.Сам генератор представляет собой сложный объект, и поэтому, если он будет возвращен , он всегда будет иметь значение True
.Генераторы имеют свой собственный протокол, в котором вы должны явно извлекать элементы по одному.При итерации это не сразу очевидно, потому что итерация автоматически делает это за вас, но при оценке она отличается.
И наоборот, если вы действительно выполняете это как понимание списка, вы должны получить желаемый результат, потому чтопустой список ([]
) оценивается как False
!Я думаю, что это ближе к тому, что вы хотите.
Вот простой пример, который можно проиллюстрировать, оценивая содержимое mylist
с пониманием списка, которое возвратит пустой список:
>>> mylist = range(10)
>>> [x for x in mylist if x == 'a']
[]
Там твой пустой список.Теперь оцените это с помощью bool()
и обратите внимание, что это False
:
>>> bool([x for x in mylist if x == 'a'])
False
Хорошо, так что если вы оцените его вместо выражения генератора:
>>> (x for x in mylist if x == 'a')
<generator object <genexpr> at 0xb7ebc644>
>>> bool((x for x in mylist if x == 'a'))
True
И дляНапример, если вы приведете это выражение генератора к списку, вы увидите, что оно на самом деле не дает результатов:
>>> list((x for x in mylist if x == 'a'))
[]
Надеюсь, это поможет!