Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Mutable and Immutable trong Python
Trong bài viết này, bạn sẽ tìm hiểu về khái niệm đánh máy động (dynamic typing) trong Python và cách nó hoạt động. Việc hiểu rõ về đánh máy động sẽ giúp bạn linh hoạt hơn khi lập trình, bởi Python cho phép thay đổi kiểu dữ liệu của biến một cách linh hoạt mà không cần khai báo trước. Điều này khác biệt so với nhiều ngôn ngữ lập trình có kiểu tĩnh, nơi mà kiểu dữ liệu của biến phải được xác định rõ ràng từ khi khai báo. Hãy cùng tìm hiểu cách Python quản lý kiểu dữ liệu của các biến và những ưu điểm mà đánh máy động mang lại.
Giới thiệu về đối tượng mutable và immutable trong Python
Trong Python, mọi thứ đều là đối tượng. Một đối tượng có trạng thái nội tại riêng của nó. Một số đối tượng cho phép bạn thay đổi trạng thái nội tại này, trong khi số khác thì không.
- Đối tượng có thể thay đổi là các đối tượng mà trạng thái nội tại của nó có thể thay đổi.
- Đối tượng không thể thay đổi là các đối tượng mà trạng thái nội tại của nó không thể thay đổi.
Ví dụ về đối tượng không thể thay đổi:
- Số (int, float, bool,…)
- Chuỗi (string)
- Bộ giá trị (tuple)
- Tập đóng băng (frozen set)
Ví dụ về đối tượng có thể thay đổi:
- Danh sách (list)
- Tập hợp (set)
- Từ điển (dictionary)
- Các lớp do người dùng định nghĩa có thể thay đổi hoặc không thể thay đổi, tùy thuộc vào trạng thái nội tại của chúng có thể thay đổi hay không.
Ví dụ về đối tượng immutable trong Python
Khi bạn khai báo một biến và gán cho nó một giá trị số nguyên, Python sẽ tạo ra một đối tượng số nguyên mới và gán biến đó để tham chiếu đến đối tượng này:
counter = 100
Để lấy địa chỉ bộ nhớ mà biến tham chiếu đến, bạn có thể sử dụng hàm id()
. Hàm id()
trả về một số nguyên hệ cơ số 10:
Bài viết này được đăng tại [free tuts .net]
print(id(counter))
Đầu ra:
140717671523072
Để chuyển đổi số hệ cơ số 10 này sang hệ thập lục phân, bạn có thể sử dụng hàm hex()
:
print(hex(id(100)))
Đầu ra:
0x7ffb62d32300
Trong bộ nhớ, bạn có một biến tên là counter
tham chiếu đến một đối tượng số nguyên nằm tại địa chỉ 0x7ffb62d32300
:
Khi bạn thay đổi giá trị của counter
thành 200 và hiển thị giá trị của nó lên màn hình:
counter = 200 print(counter)
Đầu ra:
200
Có vẻ như giá trị của đối tượng được tham chiếu bởi biến counter
đã thay đổi, nhưng thực ra không phải vậy. Python tạo ra một đối tượng số nguyên mới với giá trị 200 và gán lại biến counter
để nó tham chiếu đến đối tượng mới này:
Việc gán lại này không làm thay đổi giá trị của đối tượng số nguyên đầu tiên. Nó chỉ gán lại tham chiếu.
Ví dụ về đối tượng mutable trong Python
Dưới đây là ví dụ về một danh sách các số và hiển thị địa chỉ bộ nhớ của danh sách:
ratings = [1, 2, 3] print(hex(id(ratings))) # 0x1840f97a340
Khi bạn thêm một số vào danh sách:
ratings.append(4)
Python sẽ thay đổi trực tiếp giá trị của đối tượng danh sách:
Python Mutable Example
Và Python không tạo ra đối tượng mới như ví dụ về đối tượng không thể thay đổi ở trên.
Ví dụ về đối tượng mutable và immutable trong Python
Điều quan trọng cần hiểu là đối tượng không thể thay đổi không phải là thứ cố định hay hoàn toàn không thay đổi. Hãy xem xét ví dụ sau:
Dưới đây định nghĩa một tuple chứa hai danh sách:
low = [1, 2, 3] high = [4, 5] rankings = (low, high)
Vì rankings
là một tuple nên nó không thể thay đổi. Bạn không thể thêm hoặc xóa phần tử từ nó.
Tuy nhiên, rankings
chứa hai danh sách là các đối tượng có thể thay đổi. Do đó, bạn có thể thêm một phần tử mới vào danh sách high
mà không gặp vấn đề gì:
high.append(6) print(rankings)
Và rankings
thay đổi thành:
([1, 2, 3], [4, 5, 6])
Kết bài
Hiểu rõ sự khác biệt giữa các đối tượng mutable và immutable trong Python không chỉ giúp bạn viết mã hiệu quả hơn mà còn tránh được nhiều lỗi tiềm ẩn trong quá trình lập trình. Các đối tượng immutable như số nguyên, chuỗi và tuple mang lại sự an toàn và ổn định, vì chúng không thể thay đổi sau khi được khởi tạo. Ngược lại, các đối tượng mutable như danh sách, tập hợp và từ điển mang lại sự linh hoạt trong việc thay đổi và quản lý dữ liệu. Nắm vững khái niệm này sẽ giúp bạn áp dụng chúng một cách đúng đắn và tối ưu trong các dự án của mình.