A compreensão da lista itera sobre os valores da lista original / de entrada. Queremos que um valor seja adicionado à nova lista de saída se, e somente se, ela ainda não foi vista, daí a expressão condicional if i not in seen . Quando um novo valor é adicionado à lista nova / saída, o seen set precisa ser atualizado, daí a chamada da função seen.add(i) . No entanto, o método set.add() retorna None , que é avaliado como False . Portanto, o operador not é adicionado, para que not seen.add(i) sempre retorne True .