Tatsächlich ist Ihr Objekt in einer Variablen gespeichert und das Objekt, das als Schlüssel im Wörterbuch verwendet wird, stimmt nicht genau überein. Sie sind zwei verschiedene Referenzen auf das gleiche Objekt im Speicher.
ist das folgende Beispiel nehmen lassen:
class Foo(object):
def __init__(self, _repr):
self._repr = _repr
def __repr__(self):
return '{}-{}'.format(self._repr, id(self))
a = Foo('f1')
# The count returned by getrefcount() is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount()
print(sys.getrefcount(a) - 1) # Out: 1
d = {a: 'value'} # Out {f1-139822435732560: 'value'}
print(sys.getrefcount(a) - 1) # Out: 2
a._repr = 'f2'
print(d) # Out {f2-139822435732560: 'value'}
, die das dict erstellt einen neuen Verweis auf das Hauptobjekt prouves. Und weil Python wichtigste Methode der Speicherverwaltung Referenzzählung verwendet:
Python hält eine Zählung aller Verweise auf das Objekt, und wenn es keine mehr übrig sind, wird das Objekt gelöscht.
so, wenn Sie die Referenz in dem del a
varaiable gespeichert löschen, die Referenz in der dict gespeichert war.
del a
print(sys.getrefcount(d.keys()[0]) - 1) # Out: 1
Und das wird Unbeständigkeit machen in Sie dict, weil Sie mehr Zugriff auf Ihre Daten haben, empfehle ich die variable Referenz zu verwenden, um die Daten aus dem dict löschen als das Objekt löschen.
del d[a]
print(sys.getrefcount(a) - 1) # Out: 1
del a
Was meinen Sie mit dem Löschen des Objekts? Zeigen Sie uns den Code, der nicht funktioniert. – Moberg
Das ist, weil instance1 oder instance2 nicht in einem Wörterbuch referenziert werden, stattdessen wird ihr Hash berechnet und zum Nachschlagen gespeichert. – dnit13
Der Referenzzähler für diese Objekte kann nicht auf Null fallen, weil Sie im Wörterbuch Referenzen auf sie haben. Wenn Sie ein anderes Verhalten benötigen, machen Sie den Schlüssel zu einem [schwachen Verweis] (https://docs.python.org/3/library/weakref.html). – jonrsharpe