Toán tử in và not in thuộc kiểu gì trong python
1. Các toán tử định danh is và is notTrong python, is và is not là các toán tử dùng để so sánh "danh tính" (identity) của hai đối tượng (object), cụ thể là địa chỉ bộ nhớ của chúng. Mọi thứ trong Python đều là một đối tượng và mỗi đối tượng được lưu trữ tại một vị trí bộ nhớ cụ thể nào đó. Trong python, is và is not là các toán tử kiểm tra xem hai biến có tham chiếu đến cùng một đối tượng trong bộ nhớ hay không.
Show
Nếu chúng ta định nghĩa các biến này một cách độc lập với nhau, thì chúng sẽ được lưu trữ tại các địa chỉ bộ nhớ khác nhau và hoạt động hoàn toàn độc lập:
Như các bạn đã thấy, vì a và
b bây giờ tham chiếu đến các đối tượng khác nhau trong bộ nhớ, việc thay đổi một đối tượng này không ảnh hưởng đến đối tượng còn lại. Và đương nhiên, kết quả của phép is trong trường hợp này sẽ là False 2. Các toán tử so sánh (==) và (!=)Các đối tượng có cùng giá trị thường được lưu trữ tại các địa chỉ bộ nhớ riêng biệt. Sử dụng các toán tử đẳng thức (==) và (!=) giúp chúng ta kiểm tra xem hai đối tượng có cùng giá trị hay không, bất kể chúng được lưu trữ ở đâu trong bộ nhớ. Trong đa số các trường hợp, đây là những gì mà chúng ta muốn làm. Hãy cùng xem xét ví dụ dưới đây:
Trong ví dụ ở trên, biến b là một bản sao của a. Ta có thể thấy rằng mặc dù hai biến a và b có cùng một giá trị nhưng chúng có địa chỉ trong bộ nhớ hoàn toàn khác nhau. Và trong trường hợp này, toán tử (==) trả về kết quả True còn toán tử is trả về kết quả False. Thực tế là, khi sử dụng toán tử đẳng thức (==), thì ta đã gọi đến phương thức lớp __eq __() của đối tượng nằm bên trái (==). Ta hoàn toàn có thể override lại phương thức này
Bây giờ, chuỗi 'Hello world' của SillyString bằng chuỗi 'World hello' và thậm chí với bất kỳ đối tượng nào khác có cùng độ dài:
Đương nhiên sẽ rất ít khi chúng ta viết lại hàm so sánh, nhưng ví dụ trên minh họa những gì xảy ra khi bạn so sánh hai đối tượng sử dụng (==). Đối với toán tử (!=) chúng ta có hàm __ne __() tương ứng. Chúng ta sẽ làm rõ hơn một số cách thức so sánh của hai toán tử (==) và (!=) trong phần 3. 3. Các phương thức tương ứng với các toán tử so sánhNgoài hai toán tử (==) và (!=), ta còn có các toán tử so sánh khác như là (>), (<), (>=), (<=) dùng để so sánh giá trị của hai đối tượng. Các toán tử (==) và (!=) được gọi là equality comparison còn các toán tử (>), (<), (>=), (<=) là order comparison. Các toán tử so sánh nói chung sẽ chỉ quan tâm đến giá trị của đối tượng mà không bắt buộc Type của hai đối tượng đó phải cùng loại. Vấn đề đặt ra ở đây là: "Giá trị của một đối tượng bất kỳ là gì?". Với các đối tượng thuộc loại số như số nguyên, số thập phân, số phức, v..v thì không khó để ta biết giá trị của chúng là gì. Tuy nhiên, với các đối tượng khác như String chẳng hạn thì giá trị của chúng là một thứ rất khó xác định. Trong Python, giá trị của một đối tượng là một khái niệm khá trừu tượng. Ví dụ: Hoàn toàn không có phương thức truy cập chính tắc nào cho giá trị của đối tượng. Ngoài ra, không có ràng buộc nào hay yêu cầu rằng giá trị của một đối tượng nên được xây dựng theo một cách cụ thể, ví dụ như bao gồm tất cả các thuộc tính dữ liệu của nó. Vì vậy, các toán tử so sánh đã tạo ra các phương thức riêng để so sánh giá trị của hai đối tượng. Các hàm tương ứng của các toán tử (>), (<), (>=), (<=) lần lượt là __gt __(),__lt __() ,__ge __(),__le __() . Như đã trình bày ở phần 2, các hàm này tương tự hàm __eq __(), ta hoàn toàn có thể xây dựng lại các hàm này để định nghĩa cách mà chúng ta so sánh hai đối tượng. Sau đây là một số cách mà Python đã xây dựng cho chúng ta:
4. Kết luậnTheo nguyên tắc thông thường, bạn phải luôn luôn sử dụng các toán tử đẳng thức (==) và (!=), trừ trường hợp bạn so sánh với None:
Tóm lại, các biến có cùng giá trị thường được lưu trữ tại các địa chỉ bộ nhớ riêng biệt. Điều này có nghĩa là bạn nên sử dụng (==) hoặc (!=) để so sánh các giá trị của chúng và sử dụng is và is not khi bạn muốn kiểm tra xem hai biến có trỏ đến cùng một địa chỉ bộ nhớ hay không. |