2016-07-10 17 views
2

In meinem Testcode, warum die print Ergebnisse für Tupel und None sind unterschiedlich? Es scheint, dass a, b auf dasselbe Objekt zeigen None, aber c, d zeigen auf verschiedene Objekte, obwohl ihre Werte gleich sind (beide gleich (a,b)).In Python, ist None ein einzigartiges Objekt?

Ich weiß, dass is Keyword-Checks für das Objekt nach hinten lieber als vergleicht nur Wert wie ==. Und hier verwende ich Tupel, weil ich denke, dass Tupel unveränderlich ist, so dass es zumindest nicht darum geht, ob das Objekt veränderlich oder unveränderlich ist.

Aber warum Variablen a, b nicht erstellen und zeigen Sie auf zwei verschiedene None Objekte als c, d tun Tupel?

a=None 
b=None 
c=(1,2) 
d=(1,2) 
print(a is b) 
print(c is d) 

Antwort

4

None ist ein Singleton-Objekt: nur eine Instanz davon jemals existieren. So None Objekte Referenzierung wird immer die gleiche Identität, und zwei oder mehr solcher Objekte wird immer die Identität (Objekt Gleichheit) Test bestehen:

>>> a = None 
>>> b = None 
>>> c = None 
>>> a is b is c 
True 

Gleiches gilt für True und False

>>> d = True 
>>> (a is b is c) is d # proof of concept only 
True 
+0

Nur sicher, für Singleton-Objekt sagten Sie wie keine, True und False, grundsätzlich 'is' und' == 'genau das gleiche? Danke BTW. – Nicholas

+1

Für Booleans ist es ausreichend, das '==' zum Testen (oder das Objekt selbst) zu verwenden, da Objekte Truthy- und Falsy-Werte haben. 'c = 1' wird' c == True' übergeben (besser c direkt wie in 'if c: ...' verwenden), aber nicht 'c ist True'. Achten Sie darauf, 'is 'nur dann zu verwenden, wenn Sie die Identität nicht auf Gleichheit überprüfen wollen. –

+0

Warten, seit wann' a ist b ist c 'nicht geparst als' (a ist b) ist c '? Ich dachte, das gelte nur für die normalen Vergleichsoperatoren. ** edit: ** '' a 'in' ab 'in' abc 'ist auch gültig – Eric

6

None object is a singleton in python. Daher das Ergebnis.

Während für c und d separate Tupel erstellt werden.

Von Ihrem Beispiel:

>>> id(None) 
4454442584 
>>> id(a) 
4454442584 
>>> id(b) 
4454442584 
>>> id(c) 
4463917464 
>>> id(d) 
4463865584