キーがすでに存在し、それが存在する場合、それは現在の値に置き換えられます場合は、dict
のpythonチェックでキーと値のペアを挿入した場合。
このチェックでは、このような何かを行います。
def hash_and_value_equal(key1, key2):
return hash(key1) == hash(key2) and key1 == key2
そうではないだけの値が同じでなければならないのが、また彼らのhash
。
>>> hash_and_value_equal(0, False)
True
>>> hash_and_value_equal(1, True)
True
、したがって、彼らは(しかしないキー)の値を置き換えます:残念ながらあなたTrue
と1
もFalse
と0
は同じキーと見なされるため
>>> a = {1: 0}
>>> a[True] = 2
>>> a
{1: 2}
>>> a = {False: 0}
>>> a[0] = 2
>>> a
{False: 2}
私が示したきました手動でキーを追加する場合の手順は、dict literal
を使用する場合と同じです。
かdict
-builtin:
>>> a = dict(((0, 0), (False, 2)))
>>> a
{0: 2}
あなたは自分のクラスを記述し、辞書内の潜在的なキーとしてそれらを使用したい場合、これは非常に重要になる場合があります。 __eq__
と__hash__
これらの意志の実装に応じと同じではなく、同一のキーの値置き換えることはありません。
class IntContainer(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other
def __hash__(self):
# Just offsetting the hash is enough because it also checks equality
return hash(1 + self.value)
>>> hash_equal(1, IntContainer(1))
False
>>> hash_equal(2, IntContainer(1))
False
したがって、これら置き換えることはありません、既存の整数キー:
>>> a = {1: 2, IntContainer(1): 3, 2: 4}
>>> a
{1: 2, <__main__.IntContainer at 0x1ee1258fe80>: 3, 2: 4}
か何かをそれは、同一の鍵と考えられている:
class AnotherIntContainer(IntContainer):
def __hash__(self):
# Not offsetted hash (collides with integer)
return hash(self.value)
>>> hash_and_value_equal(1, AnotherIntContainer(1))
True
これらは現在、整数キーを置き換えます:
>>> a = {1: 2, AnotherIntContainer(1): 5}
>>> a
{1: 5}
唯一本当に重要なことは、オブジェクトとそのハッシュが等しい場合、辞書キーが等しいとみなされることです。
素敵なヘッドスクラッチャー! Pythonのデザイナーは驚きを避けようとしますが、それらをすべて得ることはできません。 – alexis
あなたのアイテムには、 '(True、 'a')'という値があり、これは '1'の値です。 – njzk2