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
検出されません。uniq
uniq
ここで、変数を変更する条件は悪いスタイルと見なされるため、これはかなり危険であることに注意してください(その機能に完全に精通していないときに、このような条件をデバッグすることを想像してください)。条件文は、チェックする変数を実際に変更するべきではありません。そのため、変数を読み取るだけで、変数に書き込むことはできません。
お役に立てれば