2013-08-28 18 views
8

Khi xem qua tài liệu và cụ thể ở đây http://docs.python.org/2/reference/expressions.html#is, tôi vẫn không thể tìm thấy phương thức dunder/protocol xác định việc triển khai từ khóa Python is. Phương pháp nào xác định nó? Từ những gì tôi hiểu, tất cả is là so sánh kết quả của hàm id khi được gọi trên hai đối tượng.Phương pháp dunder Python cho `is`

+1

Bạn nói đúng; và 'id' trả về vị trí bộ nhớ của đối tượng. Vì vậy, trừ khi bạn muốn đặt đối tượng của bạn ở một số vị trí cụ thể trong RAM, bạn sẽ không bao giờ cần phải viết thực hiện 'is' của riêng bạn. Nếu bạn muốn kiểm tra sự tương đương của hai đối tượng, hãy sử dụng '__eq__' thay vì – inspectorG4dget

+0

@ inspectorG4dget Xin cảm ơn! –

+4

Tôi vừa học được ý nghĩa của [dunder] (http://wiki.python.org/moin/DunderAlias)! –

Trả lời

10

Không có phương pháp dunder cho is. Bạn không thể ghi đè nó, và đó là cố ý. Toàn bộ điểm của is là nó cho bạn biết liệu hai biểu thức có tham chiếu cùng một giá trị hay không. Vì vậy, nó phải là sai, theo định nghĩa, cho hai giá trị khác nhau. Vì vậy, không cần phải ghi đè lên nó.

Như the docs đặt nó:

Các nhà khai thác isnot is thử nghiệm cho nhận dạng đối tượng: x is y là đúng nếu và chỉ nếu xy là cùng một đối tượng.

(Có nhiều hơn một chút trong Data model docs.)


Ngoài ra, is không so sánh kết quả của id.

id chỉ được xác định để trả về "một số nguyên được đảm bảo là duy nhất và không đổi cho đối tượng này trong suốt thời gian tồn tại". Có nghĩa là is chắc chắn có thể sử dụng id, nhưng tôi không biết bất kỳ triển khai nào thực hiện.

Điều đó đang được nói, trong CPython, nó có hiệu quả giống như vậy trong các nắp - is kiểm tra các con trỏ bằng nhau, trong khi id đưa con trỏ vào một số nguyên và trả về nó. Vì vậy, sự khác biệt duy nhất giữa việc thực hiện nó trực tiếp so với việc thực hiện nó thông qua id sẽ là một cặp cuộc gọi chức năng bổ sung và một dàn diễn dịch không có mã máy…

Nhưng trong các triển khai khác, điều đó có thể không đúng. (Mà nên được rõ ràng, khi bạn xem xét rằng Jython và PyPy được viết bằng ngôn ngữ mà thậm chí không có một điều như một con trỏ.) Ví dụ, trong PyPy, is kiểm tra rằng các đối tượng RPython cơ bản là như nhau, trong khi id trả về một khóa được tạo khi đang di chuyển (và được lưu trong bộ nhớ cache nếu sau đó bạn gọi id trên cùng một giá trị).

+0

Chờ đợi, do đó, không có thực hiện python tinh khiết cho 'is', tất cả của nó trong C? –

+0

@EdgarAroutiounian: Tất cả trong C trong CPython. Tất nhiên là trong Java, .NET, hoặc RPython trong các triển khai Python khác. – abarnert

+0

Bất kể việc triển khai thực hiện, 'id (a) == id (b)' * phải * trả lại kết quả tương tự như 'a là b' ... bạn có đồng ý không? – nmclean

Các vấn đề liên quan