2016-05-22 19 views
1
Rückkehr

Von this quieston AntwortWarum tut 'dir (1) ist dir (True)' wird return false

wahr ist, wenn zwei Variablen auf das gleiche Objekt zeigen, ==, wenn die Objekte bezeichnet durch die Variablen sind gleich.

Sind nicht dir(1) und dir(True) auf das gleiche Objekt? Beide drucken eine Liste der gleichen Methoden. Fehle ich etwas über Objekt hier?

>>> dir(1) == dir(True) 
True 
>>> dir(1) is dir(True) 
False 
>>> 
+2

Sie haben sich selbst geantwortet. – Maroun

+2

Sie zeigen auf zwei verschiedene Objekte, die zufällig den gleichen Inhalt haben –

Antwort

3

Zunächst einmal ist True1 nicht:

>>> True is not 1 
True 

Zweitens, wie die documentation sagt

dir([object])

[...] Mit einem Argument, Versuch um eine Liste gültiger Attribute für dieses Objekt zurückzugeben.

Wenn das Objekt eine Methode namens __dir__() hat, wird diese Methode aufgerufen und muss die Liste der Attribute zurückgeben. Dies ermöglicht Objekten, die eine benutzerdefinierte __getattr__() oder __getattribute__()-Funktion implementieren, die Art und Weise anpassen, wie dir() ihre Attribute meldet.

Wenn das Objekt __dir__() nicht bereitstellt, versucht die Funktion, Informationen aus dem Objekt __dict__, sofern definiert, und aus seinem Typobjekt zu sammeln. Die resultierende Liste ist nicht notwendigerweise vollständig und möglicherweise ungenau, wenn das Objekt über eine benutzerdefinierte __getattr__() verfügt.

Die resultierende Liste ist alphabetisch sortiert. [...]


Nun int und bool haben sowohl die __dir__ Schlitz von object.__dir__ gefüllt:

>>> int.__dir__ 
<method '__dir__' of 'object' objects> 
>>> bool.__dir__ 
<method '__dir__' of 'object' objects> 

und die Dokumentation für object.__dir__ fügt diese ein zusätzliches Bit an Information :

object.__dir__(self)

aufgerufen, wenn dir() auf dem Objekt aufgerufen. Eine Sequenz muss zurückgegeben werden. dir() konvertiert die zurückgegebene Sequenz in eine Liste und sortiert sie.

Da die Dokumentation sagt, dir konstruiert eine neue Liste für jeden Aufruf und dann Sorten es. (Wir könnten auch den Code für _dir_object suchen, der PySequence_List auf dem Rückgabewert __dir__ aufruft; PySequence_List nimmt eine Sequenz als Argument und gibt eine neue Liste mit den gleichen Elementen wie die ursprüngliche Sequenz zurück, diese neu erstellte Liste ist dann sorted und returned)

>>> a = 1 
>>> dir(a) is dir(a) 
False 

Drittens True ist eine Instanz vom Typ bool, die eine Unterklasse von int ist.

>>> isinstance(True, bool) 
True 
>>> isinstance(1, int) 
True 
>>> issubclass(bool, int) 
True 
>>> isinstance(True, int) 
True 

Zusätzlich bool fügt keine Methoden, die in int nicht bereits vorhanden sind. Und weil die resultierende Liste ist alphabetisch sortiert,

>>> dir(1) == dir(True) 
True 
+0

* "Wie die Dokumentation sagt" * - Wo ist es? –

+0

@StefanPochmann Die Dokumentation besagt, dass 'dir()' die Daten aus dem Attribut '__dict__' des Objekts sammelt und dann alphabetisch sortiert. Allerdings muss ich eine Klarstellung hinzufügen, dass es "__dir__" gibt –

+0

@StefanPochmann behoben –

2

Jedesmal Thet Sie dir das neue Objekt ausführen erstellt wird.

>>> dir(True) is dir(True) 
False 
0

dir erstellt ein neues Objekt für die int, dass es jedes Mal ist zurück.

Im Grunde haben Sie zwischen 1 is True und dir(1) is dir(True) und dir(1) == dir(True) verwirrt.

Verwandte Themen