Разберите это на части:
... elem not in c and not c.append(elem)
Эта часть сначала проверяет, находится ли elem
в c
( Примечание : предыдущий c
, ранее объявленный как c = []
) и, если это не так, добавьте его в c
. Поскольку list.append
всегда возвращает None
, что является ошибочным значением. not
до того, как он инвертирует результат в True
, поэтому элемент также выбирается при понимании списка.
Код эффективно отфильтровывает уникальные общие элементы в a
и b
и эквивалентен следующему коду:
list_comp_result = []
for elem in a:
if elem in b:
if elem not in c:
c.append(elem) # <-- always None
list_comp_result.append(elem)
Это - понятие отладки. В основном исключения выдаются к отладчику первый и затем к фактической программе, где, если это не обрабатывается, это брошено в отладчик второй время, дав Вам шанс , чтобы сделать что-то с ним в Вашем IDE прежде и после самого приложения. Это, кажется, изобретение Microsoft Visual Studio.
Первые случайные уведомления об исключении повышены, когда исключение выдается. Вторые случайные уведомления - когда это не поймано. (Шанс - как в возможности ворваться в код в отладчике).