set.removeインプレース操作です。これは、何も返さないことを意味します(まあ、それは返しますNone); とbool(None)ですFalse。
したがって、リスト内包表記は事実上次のとおりです。
answer = []
for item in seq:
if item in uniq and not uniq.remove(item):
answer.append(item)
Pythonは(他の人が指摘しているように)条件の短絡を行うので、これは事実上次のようになります。
answer = []
for item in seq:
if item in uniq:
if not uniq.remove(item):
answer.append(item)
もちろん、unique.remove(item)returns None(のboolはFalse)なので、両方の条件が評価されるか、どちらも評価されません。
2番目の条件が存在する理由は、から削除するためitemですuniq。このように、item(の重複として)再度遭遇した場合、前回そこで検出されたときから削除されたため、でseq検出されません。uniquniq
ここで、変数を変更する条件は悪いスタイルと見なされるため、これはかなり危険であることに注意してください(その機能に完全に精通していないときに、このような条件をデバッグすることを想像してください)。条件文は、チェックする変数を実際に変更するべきではありません。そのため、変数を読み取るだけで、変数に書き込むことはできません。
お役に立てれば