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`
Odpowiedz
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
inot 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).
Czekaj, więc nie ma czystej implementacji Pythona dla 'is', wszystko w C? –
@ EdgarAroutiounian: Wszystko w C w CPython. Oczywiście jest w Javie, .NET lub RPython w innych implementacjach Pythona. – abarnert
Niezależnie od implementacji, 'id (a) == id (b)' * musi * zwróci ten sam wynik co 'a is b' ... czy zgodziłbyś się? – nmclean
- 1. Python Mixin dla __str__and Metoda Resolution Order
- 2. Python słownik kopia metoda
- 3. Metoda getWindow() jest niezdefiniowana dla typu AlertDialog.Builder
- 4. Metoda klasy języka Python Wrap
- 5. Jak twierdzić, że metoda jest ozdobiona python unittest?
- 6. metoda getApplicationContext() jest niezdefiniowane
- 7. Python: Zoptymalizowana metoda cięcia/krojenia posortowanych list
- 8. Metoda „getSupportFragmentManager()” jest unsuported
- 9. Metoda getChildFragmentManager() jest niezdefiniowana
- 10. metoda getSupportFragmentManager() jest niezdefiniowana
- 11. Jaka jest metoda Pattern.quote?
- 12. Metoda odpowiednik dla @InjectMocks
- 13. Niezdefiniowana metoda dla `before_filter '
- 14. python resettable metoda instancji memoization decorator
- 15. Python: metoda Podział wezwanie do wielu linii
- 16. Czy Python GIL jest naprawdę dla interpretera?
- 17. Co to jest python dla BigDecimal Java?
- 18. Metoda wywołania czasowego w języku Python
- 19. Co to jest metoda generatywna?
- 20. Python3: sprawdzić, czy metoda jest statyczna
- 21. "Metoda setListAdapter (ArrayAdapter) jest niezdefiniowana dla typu create"
- 22. Jaka jest alternatywna metoda dla "self.isTouchEnabled" w Cocos2d 2.0?
- 23. Metoda getString (int) jest niezdefiniowana dla typu Apps
- 24. Jaka jest odpowiednia metoda "sizeWithFont:" dla komputerów Mac?
- 25. Jaka jest najtańsza metoda uzyskania liczby wierszy dla zapytania SQL?
- 26. Czy metoda executeUpdate w Javie jest bezpieczna dla wątków?
- 27. Metoda wirtualna nie jest wywoływana
- 28. Java: Ogólna metoda dla Enums
- 29. Metoda szablonowa dla klas statycznych
- 30. metoda rozszerzenia dla metody C#
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
@ inspectorG4dget Thanks! –
Właśnie nauczyłem się znaczenia [dunder] (http://wiki.python.org/moin/DunderAlias)! –