質問の最初の部分(タイトルにあります)は以前に数回回答されています(つまり、 NaNがNaNと等しくないのはなぜですか? )、2番目のピースがなぜ機能するのかわかりません(この質問 に触発されてNaNを含むリストをチェックする方法 )?
つまり:
_>> nan == nan
False
>> nan in [nan]
True
_
@DSMからの回答を考慮した質問の補足説明。それでは、なぜfloat("nan")
はnan
とは異なる動作をするのでしょうか。単純なnan
に再度評価する必要はありませんか?なぜインタープリターはこのように動作しますか?
_>> x = float("nan")
>> y = nan
>> x
nan
>> y
nan
>> x is nan, x is float("nan"), y is nan
(False, False, True)
_
基本的に、最初のケースでは同じジェネリックnan
を参照しますが、2番目のケースでは別のオブジェクトを作成します。
_>> nans = [nan for i in range(2)]
>> map(id, nans)
[190459300, 190459300]
>> nans = [float("nan") for i in range(2)]
>> map(id, nans)
[190459300, 190459301]
_
nan
がnan
と等しくないのはnan
の定義の一部なので、その部分は簡単です。
_nan in [nan]
_がTrueであるのは、リストに含まれるかどうかの同等性の前にIDがテストされるためです。同じ2つのオブジェクトを比較しています。
2つのdifferentnan
sで同じことを試みた場合、Falseが返されます。
_>>> nans = [float("nan") for i in range(2)]
>>> map(id, nans)
[190459300, 190459284]
>>> nans
[nan, nan]
>>> nans[0] is nans[1]
False
>>> nans[0] in nans
True
>>> nans[0] in nans[1:]
False
_
あなたの補遺は実際にnan
とあまり関係がありません、それは単にPythonが機能する方法です。float("nan")
が戻る義務がないことを理解したらいくつかのナンシングルトン、およびその_y = x
_はx
のコピーを作成せず、代わりにy
という名前をx
で指定されたオブジェクトにバインドします。何も残っていません取得するため。