2015-10-21 9 views
8

Wenn ich den folgenden Code in einem Python-Interpreter ausführen:Warum ist "Objekt .__ dict__ ist Objekt .__ dict__" False?

>>> object.__dict__ is object.__dict__ 
False 

Warum ist das Ergebnis False?

+3

Weil Sie ein 'dict_proxy'-Objekt erhalten, das jedes Mal neu erstellt wird, wenn Sie auf das Attribut '__dict__' zugreifen und schreibgeschützt sind, um zu verhindern, dass Sie mit 'Objekt' herumhantieren. – jonrsharpe

Antwort

7

object.__dict__, im Gegensatz zu anderen __dict__ s, gibt ein mappingproxy Objekt zurück (a dict_proxy in Python 2). Diese werden im laufenden Betrieb erstellt, wenn __dict__ angefordert wird. Daher erhalten Sie bei jedem Zugriff auf object.__dict__ einen neuen Proxy. Sie alle teilen sich das gleiche zugrunde liegende Objekt, aber der Proxy ist die ganze Zeit über frisch. Deshalb können Sie nicht zwei identische bekommen.

+0

Das heißt, '{'foo': 'bar'} ist {'foo': 'bar'}' scheint auch 'False' zu ​​sein ... ist das nicht ein breiteres dict-Verhalten, nicht etwas bestimmtes 'Objekt .__ dict__'? – DreadPirateShawn

+0

Danke, warum kann dieser Mappingproxy nicht zwischengespeichert und dann wiederverwendet werden? – NathaneilCapital

+2

@DreadPirateShawn Das liegt daran, dass Sie * zwei separate Wörterbücher * erstellen. 'd = {'foo': 'bar'}; d is d wird sich so verhalten, wie Sie es erwarten. – jonrsharpe