Toán tử nhận dạng trong Python đóng vai trò quan trọng để kiểm tra xem hai biến có thực sự tham chiếu đến cùng một đối tượng trong bộ nhớ hay không. Để hiểu rõ hơn về các loại toán tử nhận dạng phổ biến và cách sử dụng chúng, đặc biệt là toán tử is và is not, mời bạn đọc cùng theo dõi chi tiết trong bài viết này để nắm vững kiến thức cần thiết và ứng dụng hiệu quả trong công việc.
Các điểm chính
Khi đọc xong bài viết, bạn sẽ:
- Hiểu Rõ Khái Niệm Toán Tử Nhận Dạng: Bạn sẽ nắm vững định nghĩa và mục đích sử dụng của toán tử nhận dạng trong Python, giúp bạn phân biệt nó với các loại toán tử khác.
- Phân Biệt is và is not: Bạn sẽ hiểu sự khác biệt then chốt giữa hai toán tử is và is not, biết khi nào nên sử dụng toán tử nào cho phù hợp với từng tình huống.
- Nắm Vững Cách Sử Dụng Toán Tử Trong Thực Tế: Thông qua các ví dụ minh họa về chuỗi, danh sách và ID của các phần tử, bạn sẽ học được cách áp dụng toán tử nhận dạng vào giải quyết các vấn đề lập trình cụ thể.
- Khám Phá Chi Tiết ID Của Các Phần Tử Trong List: Tìm hiểu sâu hơn về ID của các phần tử giúp người học hiểu rõ hơn về cơ chế hoạt động và lưu trữ dữ liệu trong Python
- Có Thêm Tài Nguyên Học Lập Trình Python Chất Lượng: Biết đến Vietnix như một nguồn tài liệu và khóa học lập trình online hữu ích, hỗ trợ quá trình học tập của bạn.
Toán tử nhận dạng trong Python
Toán tử nhận dạng trong Python dùng để so sánh hai đối tượng, xác định xem hai đối tượng có cùng vị trí trên bộ nhớ, và cùng kiểu dữ liệu (data type) hay không.
Trong Python có 2 loại toán tử nhận dạng là is
và is not
.

Toán tử is
Toán tử is sẽ trả về giá trị True
nếu hai đối tượng ở hai bên toán tử cùng chia sẻ một vị trí ô nhớ. Để xác định vị trí ô nhớ của một đối tượng, chúng ta có thể dùng hàm id()
. Nếu id()
của hai biến cho ra kết quả giống nhau, thì toán tử is
trả về True
.
Để bạn dễ hình dung, hãy tưởng tượng hai người bạn cùng chung nhau một phòng trọ. Dù hai bạn là hai cá thể riêng biệt, nhưng khi nói đến địa chỉ, thì cả hai bạn sẽ có chung một địa chỉ.
xe_cua_ban = ["Honda", "mau_do", 2023]
# Bạn của bạn mượn xe của bạn và vẫn sử dụng chính chiếc xe đó.
xe_ban_muon = xe_cua_ban
# Tạo một chiếc xe y hệt
xe_moi_mua_giong_het = ["Honda", "mau_do", 2023]
# So sánh sử dụng 'is'
print(xe_cua_ban is xe_ban_muon)
print(xe_cua_ban is xe_moi_mua_giong_het)
# Xem địa chỉ trong bộ nhớ (ID)
print("id(xe_cua_ban) : ", id(xe_cua_ban))
print("id(xe_ban_muon): ", id(xe_ban_muon))
print("id(xe_moi_mua_giong_het) : ", id(xe_moi_mua_giong_het))
Khi thực thi, code trên sẽ cho kết quả:
True
False
id(xe_cua_ban) : [một_số_id_nào_đó]
id(xe_ban_muon): [một_số_id_nào_đó_giống_hệt_id_trên]
id(xe_moi_mua_giong_het) : [một_số_id_khác]
Toán tử is not
Toán tử is not trong Python được dùng để kiểm tra xem hai đối tượng có khác biệt về vị trí trên bộ nhớ hay không. Kết quả của phép so sánh is not là True nếu hai đối tượng không cùng nằm trên một ô nhớ, và False nếu ngược lại.
Để dễ hình dung, hãy tưởng tượng bạn có hai cuốn sổ tay:
so_tay_cua_An = ["Việc A", "Việc B", "Việc C"] # An có một cuốn sổ tay
so_tay_cua_Binh = ["Việc A", "Việc B", "Việc C"] # Bình cũng có một cuốn sổ tay
so_tay_cua_An_Ban_Sao = so_tay_cua_An # An tạo một bản sao của số tay của bạn
# So sánh
print("Sổ tay của An có khác sổ tay An bản sao không? ", so_tay_cua_An is not so_tay_cua_An_Ban_Sao)
print("Sổ tay của An có khác sổ tay của Bình không? ", so_tay_cua_An is not so_tay_cua_Binh)
# Xem vị trí trên bộ nhớ (bạn không cần nhớ các con số này, chỉ cần quan sát sự giống/khác nhau)
print("Vị trí sổ tay An:", id(so_tay_cua_An))
print("Vị trí sổ tay Bình:", id(so_tay_cua_Binh))
print("Vị trí bản sao sổ tay An:", id(so_tay_cua_An_Ban_Sao))
Khi chạy code, bạn sẽ thấy:
Sổ tay của An có khác sổ tay An bản sao không? False
Sổ tay của An có khác sổ tay của Bình không? True
Vị trí sổ tay An: 140559927442176 (Ví dụ)
Vị trí sổ tay Bình: 140559925598080 (Ví dụ)
Vị trí bản sao sổ tay An: 140559927442176 (Ví dụ)
Lưu ý:
is not
: Kiểm tra xem hai biến có cùng trỏ đến một đối tượng trong bộ nhớ hay không.!=
: Kiểm tra xem giá trị của hai biến có khác nhau hay không.- Trong ví dụ trên, nếu bạn thay
is not
bằng!=
: kết quả sẽ khác (so_tay_cua_An != so_tay_cua_Binh
sẽ trả vềFalse
vì nội dung của hai danh sách này giống nhau, mặc dù chúng ở các vị trí khác nhau trên bộ nhớ).
Một vài ví dụ về toán tử nhận dạng trong Python
Để bạn hiểu rõ hơn về toán tử này, hãy xem qua các ví dụ dưới đây.
Ví dụ 1: Chuỗi
chuoi_A = "HocPython"
chuoi_B = chuoi_A
print("ID của chuoi_A:", id(chuoi_A))
print("ID của chuoi_B:", id(chuoi_B))
print("chuoi_A is chuoi_B:", chuoi_A is chuoi_B) #Kiểm tra ID
print("chuoi_B is not chuoi_A:", chuoi_B is not chuoi_A) #Kiểm tra ID
Kết quả:
ID của chuoi_A: 140734682150032
ID của chuoi_B: 140734682150032
chuoi_A is chuoi_B: True
chuoi_B is not chuoi_A: False
Giải thích:
id()
: là một hàm Python trả về “định danh” (identity) của một đối tượng. Định danh này là một số nguyên duy nhất và không đổi trong suốt vòng đời của đối tượng đó. Nó có thể được xem như địa chỉ của đối tượng trong bộ nhớ.- Ví dụ: Trong ví dụ này,
chuoi_B = chuoi_A
không tạo ra một bản sao của chuỗi “HocPython”. Thay vào đó,chuoi_B
chỉ đơn giản là một tham chiếu khác đến cùng một đối tượng chuỗi “HocPython” màchuoi_A
đang trỏ tới. Vì vậy,id(chuoi_A)
vàid(chuoi_B)
giống hệt nhau. - Kết quả: Do đó,
chuoi_A is chuoi_B
trả vềTrue
vàchuoi_B is not chuoi_A
làFalse
.
Ví dụ 2: Danh sách (list)
danh_sach_A = [1, 2, 3]
danh_sach_B = [1, 2, 3]
print("ID của danh_sach_A", id(danh_sach_A))
print("ID của danh_sach_B", id(danh_sach_B))
print("danh_sach_A is danh_sach_B:", danh_sach_A is danh_sach_B) # Kiểm tra id
print("danh_sach_B is not danh_sach_A:", danh_sach_B is not danh_sach_A) # Kiểm tra id
Kết quả:
ID của danh_sach_A 1954971968128
ID của danh_sach_B 1954926570880
danh_sach_A is danh_sach_B: False
danh_sach_B is not danh_sach_A: True
Giải thích:
- Ở đây,
danh_sach_A
vàdanh_sach_B
tuy có cùng giá trị các phần tử nhưng lại là hai đối tượnglist
khác nhau, được lưu ở hai vị trí khác nhau trên bộ nhớ. - Vì vậy
id(danh_sach_A)
vàid(danh_sach_B)
cho hai giá trị khác nhau, dẫn đếndanh_sach_A is danh_sach_B
làFalse
vàdanh_sach_B is not danh_sach_A
làTrue
.
Ví dụ 3: ID của các phần tử trong list
print (id(danh_sach_A[0]), id(danh_sach_A[1]), id(danh_sach_A[2]))
print (id(danh_sach_B[0]), id(danh_sach_B[1]), id(danh_sach_B[2]))
Điều này sẽ thu được kết quả sau:
Kết quả:
2739311598832 2739311598864 2739311598896
2739311598832 2739311598864 2739311598896
Giải thích chi tiết:
- Dù
danh_sach_A
vàdanh_sach_B
là hai đối tượnglist
khác nhau (như đã thấy ở ví dụ 2), các phần tử bên trong chúng lại có thể tham chiếu đến cùng một đối tượng số nguyên. - Trong Python, các số nguyên nhỏ (thường từ -5 đến 256) được lưu trữ trong một “hồ” (pool) các đối tượng số nguyên. Khi bạn tạo một biến có giá trị là một trong những số nguyên này, Python chỉ đơn giản là cho biến đó trỏ đến đối tượng số nguyên đã có sẵn trong hồ, thay vì tạo một đối tượng mới. Đây là cơ chế tối ưu hóa bộ nhớ.
- Vì lý do đó
id(danh_sach_A[0])
, vàid(danh_sach_B[0])
có cùng một địa chỉ: vì Python đưa 2 biến trỏ tới một cùng số 1 ở 1 địa chỉ.
Lời kết
Vậy là chúng ta vừa cùng nhau khám phá chi tiết về toán tử nhận dạng trong Python, bao gồm is
và is not
, cùng các ví dụ minh họa cụ thể trên chuỗi và danh sách. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách thức hoạt động của chúng, đặc biệt là khi so sánh ID của các đối tượng.
Mọi người cũng đọc