2016-07-04 43 views
35

dwóch zmiennych w Pythonie mają takie same id:dwóch zmiennych w Pythonie mają ten sam identyfikator, ale nie listy lub krotki

a = 10 
b = 10 
a is b 
>>> True 

Jeśli wezmę dwa list s:

a = [1, 2, 3] 
b = [1, 2, 3] 
a is b 
>>> False 

według this link Senderle odpowiedział, że niezmienne referencje obiektów mają ten sam identyfikator, a zmienne obiekty, takie jak listy, mają różne identyfikatory.

Więc teraz według jego odpowiedź, krotki powinny mieć takie same identyfikatory - co oznacza:

a = (1, 2, 3) 
b = (1, 2, 3) 
a is b 
>>> False 

Najlepiej, jak krotki nie są zmienne, powinien on powrócić True, ale wraca False!

Jakie jest wytłumaczenie?

+0

Trzeba rozróżnić zmiennych i obiektów (list i krotek) - jeśli porównać dwa obiekty jak to porównać ich adresy pamięci, które różnią się, mimo tej samej listy i krotki elementy. – dmitryro

+13

Myślę, że źle zrozumiałeś odpowiedź, do której prowadzi link. Odrębne niezmienne obiekty mają różne identyfikatory. Ale dla liczb całkowitych <256 (dla większości tłumaczy) wartość jest wstępnie załadowana do pamięci i dlatego w twoim pierwszym przykładzie jest b –

+0

Dziękuję @JacquesGaudin! Teraz sprawia mi to pewne zrozumienie. –

Odpowiedz

44

Obiekty trwałe nie mają tego samego id, a co więcej, nie jest tak w przypadku obiektów definiowanych osobno. Za każdym razem, gdy definiujesz obiekt w Pythonie, utworzysz nowy obiekt z nową tożsamością.

Ale są pewne wyjątki dla małych liczb całkowitych (od -5 do 256) i małych ciągów (internowanych ciągów, ze specjalną długością (zwykle mniej niż 20 znaków)), które są singletonami i mają ten sam id (właściwie jeden obiekt z wskaźnik wielokrotny). Możesz sprawdzić ten fakt, jak następuje:

>>> 30 is 20 + 10 
True 
>>> 
>>> 300 is 200 + 100 
False 
>>> 'aa' * 2 is 'a' * 4 
True 
>>> 'aa' * 20 is 'a' * 40 
False 

A dla niestandardowego obiektu:

>>> class A: 
... pass 
... 
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity 
False 

Należy również pamiętać, że operator is sprawdzi tożsamość obiektu, a nie wartości. Jeśli chcesz sprawdzić wartość należy użyć ==:

>>> 300 == 3*100 
True 

A ponieważ nie ma takiej reguły za krotki (inne rodzaje) Jeśli zdefiniujemy dwie takie same krotki w dowolnym rozmiarze dostaną własne identyfikatory:

>>> a = (1,) 
>>> b = (1,) 
>>> 
>>> a is b 
False 

i pamiętać, że fakt pojedynczych liczb całkowitych i ciągi internowany jest prawdą nawet podczas definiowania ich w modyfikowalnych i niezmiennych obiektów:

>>> a = (100, 700, 400) 
>>> 
>>> b = (100, 700, 400) 
>>> 
>>> a[0] is b[0] 
True 
>>> a[1] is b[1] 
False 
+0

w ostatnio wspomnianym przykładzie (z krotek): a [1] jest b [1] powinno być prawdziwe, dlaczego zwróciło fałsz? –

+4

@Ram Dlaczego uważasz, że powinien zwrócić True, są to 2 oddzielne obiekty (liczby całkowite), ale o tej samej wartości (nie id). I pamiętaj, że są one nie mniej niż 256. – Kasramvd

+1

tak, zgadzam się. Myślę, że tylko liczby całkowite <256 zwrócą identyfikator ids() true. każda liczba całkowita większa niż 256 w interpreterze Pythona będzie mieć własną przestrzeń id, wartości będą takie same. –

19

Immutable != Ten sam obiekt.*

An immutable object is simply an object whose state cannot be altered; i to wszystko. Po utworzeniu nowego obiektu, zostanie mu przypisany nowy adres. Jako takie, sprawdzanie, czy adresy są równe is, zwróci False.

Fakt 1 is 1 lub "a" is "a" powraca True wynika integer caching i ciąg interning wykonywane przez Python więc niech nie mylić; nie jest związane z przedmiotami, o których mowa, są zmienne/niezmienne.


* Puste niezmienne obiekty do refer to the same object i ich is Ness ma powrócić prawda, jest to szczególny przypadek szczególny realizacja, choć.

15

Spójrz na ten kod:

>>> a = (1, 2, 3) 
>>> b = (1, 2, 3) 
>>> c = a 
>>> id(a) 
178153080L 
>>> id(b) 
178098040L 
>>> id(c) 
178153080L 

Aby dowiedzieć się, dlaczego a is c jest oceniany jako True, natomiast a is b rentowności False Zdecydowanie zalecamy, aby uruchomić krok po kroku urywek powyżej w Online Python Tutor. Graficzna reprezentacja obiektów w pamięci zapewni ci głębszy wgląd w ten problem (załączam zrzut ekranu).

enter image description here