Python

The sameness in Python

Trong bài viết này, mình sẽ chỉ ra một số khác biệt giữa operator == và operator is .

  • Operator is used for object identity tests.
  • Operator == used for equality compares.

Các đối tượng được thử nghiệm gồm: number, string, list, tuple, dict và object.

Example 1: Numbers comparing
Numbers are immutable (unchangeable) values, supporting numeric operations.

>>> a = 10
>>> b = 10
>>> a is b
True
>>> a == b
True
>>> id(a)
31828452
>>> id(b)
31828452

Vì number là immutable, nên Python sẽ cấp phát cùng một object cho cả a và b khi chúng có cùng giá trị. Với kết quả từ ví dụ trên ta thấy rằng a và b có cùng identity (31828452). Do đó, operator ==is đều cho kết quả True.

Example 2: Strings comparing
The normal string object is an immutable (unchangeable) sequence of characters accessed by offset (position).

>>> strA = "abcd"
>>> strB = "abcd"
>>> strC = "ABCD"
>>> strD = input()
abcd
>>> strA is strB
True
>>> strA == strB
True
>>> strA is strC
False
>>> strA == strC
False
>>> strA == strD
True
>>> strA is strD
False
>>> id(strA)
37055296
>>> id(strB)
37055296
>>> id(strC)
37285600
>>> id(strD)
37578904

Tương tự, vì string là immutable, nên Python sẽ cấp phát cùng một object cho cả strA và strB khi chúng có cùng nội dung. Với kết quả từ ví dụ trên ta thấy rằng strA và strB có cùng identity (37055296), do đó operator ==is đều cho kết quả True. Đối với strA và strD, vì 2 string này có nội dung giống nhau nhưng là 2 đối tượng khác nhau nên operator == cho kết quả True còn operator is cho kết quả False.

Example 3: Lists comparing
Lists are mutable (changeable) sequences of object references accessed
by offset (position).

>>> listA = [1,2,3]
>>> listB = [1,2,3]
>>> listA is listB
False
>>> listA == listB
True

Mỗi list sẽ được cấp phát bộ nhớ riêng biệt, do đó operator is sẽ cho kết quả False, trong khi đó do listA và listB có nội dung giống nhau nên operator == cho kết quả True. Kết quả cũng tương tự đối với dictionaries và tuples (tuples are immutable).

Example 4: Object comparing

>>> class demo():
..     def __str__(self):
           return "hello"
>>> objectA = demo()
>>> objectB = demo()
>>> id(objectA)
37323600
>>> id(objectB)
37323640
>>> objectA is objectB
False
>>> objectA == objectB
False

Do objectA và objectB là 2 đối tượng riêng biệt nên cả operator ==is đều cho kết quả False.

Hy vọng qua bài viết này các bạn sẽ hiểu rõ hơn về operator ==operator is trong Python.

Thân ái.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s