8

「キーが辞書にない場合:何かをする」として、辞書内のキーの存在をテストしたい すでにこれを複数回行っていますが、今回は奇妙な動作をします。

特に:

termCircuit = termCircuitMap[term]

KeyError を返します

このコードを Eclipse PyDev でデバッグしたところ、(式を使用して) 次の結果が得られました。

term in termCircutiMap        # prints False
term in termCircuitMap.keys() # prints True

これがどのように可能であるかを誰かが理解していますか?何かがキーセットに「ある」場合、それは辞書に「ある」と思いました。

評価のスクリーンショットを添付します。

http://img836.imageshack.us/img836/1274/screenshotpython.png

説明してくれてありがとう:)

4

1 に答える 1

11

__hash__キーの機能が適切に定義されていない場合、この動作が見られることがあります。たとえば、以下は、説明したのとほぼ同じ動作を示します。

import random

class Evil(int):
    def __hash__(self):
        return random.randint(0, 10000)

evil_vals = [Evil(n) for n in range(10)]

dict_with_evil_keys = dict((evil_val, None)
                           for evil_val in evil_vals)

print evil_vals[0] in dict_with_evil_keys # prints False
print evil_vals[0] in dict_with_evil_keys.keys() # prints True

この場合、ランダムなハッシュ値を生成していますが、これは明らかに悪い考えです。キーの値が変更可能である場合、同じ効果をもたらすあまり目立たない問題が考えられます。(一般に、変更可能な値は を定義する__hash__べきではなく、辞書のキーとして使用できるべきではありません。)

于 2013-04-24T19:20:44.817 に答える