Wenn Sie ein Schlüssel-Wert-Paar stecken in einer dict
Python prüft, ob der Schlüssel bereits vorhanden ist, und wenn es vorhanden ist, wird es den aktuellen Wert zu ersetzen.
Diese Prüfung macht etwas wie folgt aus:
def hash_and_value_equal(key1, key2):
return hash(key1) == hash(key2) and key1 == key2
So müssen nicht nur die Werte gleich sein, sondern auch ihre hash
.Leider für Sie True
und 1
sondern auch False
und 0
werden gleiche Schlüssel berücksichtigt werden:
>>> hash_and_value_equal(0, False)
True
>>> hash_and_value_equal(1, True)
True
und daher ersetzen sie den Wert (aber nicht der Schlüssel):
>>> a = {1: 0}
>>> a[True] = 2
>>> a
{1: 2}
>>> a = {False: 0}
>>> a[0] = 2
>>> a
{False: 2}
zeigte ich habe Der Fall eines manuellen Hinzufügens eines Schlüssels, aber die durchgeführten Schritte sind die gleichen, wenn dict literal
:
verwendet wird
oder die dict
-builtin:
>>> a = dict(((0, 0), (False, 2)))
>>> a
{0: 2}
Dies kann sehr wichtig sein, wenn Sie eigene Klassen schreiben und wollen, dass sie als mögliche Schlüssel in Wörterbücher verwenden. Je nach Implementierung von __eq__
und __hash__
diesem Willen und die Werte der gleichen, aber nicht identischer Schlüssel nicht ersetzen:
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
diese wird also nicht ersetzen bestehende ganzzahlige Schlüssel:
>>> a = {1: 2, IntContainer(1): 3, 2: 4}
>>> a
{1: 2, <__main__.IntContainer at 0x1ee1258fe80>: 3, 2: 4}
oder etwas daß als identisch betrachtet Schlüssel:
class AnotherIntContainer(IntContainer):
def __hash__(self):
# Not offsetted hash (collides with integer)
return hash(self.value)
>>> hash_and_value_equal(1, AnotherIntContainer(1))
True
Diese werden nun die ganze Zahl Tasten ersetzen:
Die einzige wirklich wichtige Sache ist zu bedenken, dass Dictionary Keys gleichwertig sind, wenn die Objekte und ihr Hash gleich sind.
Schöner Kopf-Scratcher! Pythons Designer versuchen, Überraschungen zu vermeiden, aber Sie können sie nicht alle bekommen ... – alexis
Sie haben die Lösung in Ihren Elementen: '(True, 'a')', was der Wert für '1' ist. – njzk2