web-dev-qa-db-ja.com

なぜnanpy in nan == nan`がFalseなのにnan in [nan]がTrueなのですか?

質問の最初の部分(タイトルにあります)は以前に数回回答されています(つまり、 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]
_
37
sashkello

nannanと等しくないのはnanの定義の一部なので、その部分は簡単です。

_nan in [nan]_がTrueであるのは、リストに含まれるかどうかの同等性の前にIDがテストされるためです。同じ2つのオブジェクトを比較しています。

2つのdifferentnansで同じことを試みた場合、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で指定されたオブジェクトにバインドします。何も残っていません取得するため。

39
DSM