2013-08-28 12 views
8

Podczas przeglądania dokumentów, a szczególnie tutaj http://docs.python.org/2/reference/expressions.html#is, nadal nie mogę znaleźć metody dunder/protocol, która definiuje implementację słowa kluczowego Python is. Jaka metoda to określa? Z tego, co rozumiem, wszystkie is polega na porównaniu wyników funkcji id po wywołaniu dwóch obiektów.Metoda Python dunder dla `jest`

+1

Masz rację; a 'id' zwraca położenie pamięci obiektu. Więc jeśli nie chcesz umieścić swojego obiektu w konkretnej lokalizacji w pamięci RAM, nigdy nie powinieneś pisać swojej implementacji 'is'. Jeśli chcesz sprawdzić równoważność dwóch obiektów, użyj '__eq__' zamiast – inspectorG4dget

+0

@ inspectorG4dget Thanks! –

+4

Właśnie nauczyłem się znaczenia [dunder] (http://wiki.python.org/moin/DunderAlias)! –

Odpowiedz

10

Nie istnieje metoda wygaszenia dla is. Nie możesz tego zmienić, a to jest celowe. Cały punkt is polega na tym, że informuje, czy dwa wyrażenia odnoszą się do tej samej wartości. Zatem z definicji musi być fałszywa dla dwóch różnych wartości. Więc nie ma potrzeby, aby to zmienić.

Jak the docs umieścić go:

operatorów is i not is badanie tożsamości obiektu: x is y jest prawdziwe wtedy i tylko wtedy x i y są tego samego obiektu.

(Jest trochę bardziej w Data model docs.)


Również is nie porównać wyniki id.

id jest właśnie zdefiniowany, aby zwrócić "liczbę całkowitą, która jest gwarantowana jako unikalna i stała dla tego obiektu podczas jego trwania". Co oznacza, że ​​is z pewnością może użyć id, ale nie wiem o jakiejkolwiek implementacji, gdzie to robi.

W rzeczywistości, w CPython robi to samo pod kołdrą- is sprawdza, czy wskaźniki są równe, podczas gdy id rzuca wskaźnik na liczbę całkowitą i zwraca ją. Tak więc jedyną różnicą między implementacją bezpośrednio lub implementacją za pomocą id byłaby dodatkowa para wywołań funkcji i rzutowania, który nie byłby kompilowany bez kodu maszynowego ...

Ale w innych implementacjach nawet to może nie być prawdą. (Co powinno być oczywiste, gdy weźmiesz pod uwagę, że Jython i PyPy są napisane w językach, które nie mają nawet nic takiego jak wskaźnik.) Na przykład w PyPy, is sprawdza, czy podstawowe obiekty RPython są takie same, podczas gdy id zwraca klucz wygenerowany w locie (i buforowany, jeśli później wywołasz id na tej samej wartości).

+0

Czekaj, więc nie ma czystej implementacji Pythona dla 'is', wszystko w C? –

+0

@ EdgarAroutiounian: Wszystko w C w CPython. Oczywiście jest w Javie, .NET lub RPython w innych implementacjach Pythona. – abarnert

+0

Niezależnie od implementacji, 'id (a) == id (b)' * musi * zwróci ten sam wynik co 'a is b' ... czy zgodziłbyś się? – nmclean

Powiązane problemy