Logo Zephyrnet

Hiểu Mutable và Immutable trong Python

Ngày:

Mục lục

Đóng góp bởi: Karuna Kumari

Trong thế giới lập trình, việc hiểu các khái niệm về tính có thể thay đổi và tính không thay đổi là rất quan trọng, đặc biệt là khi làm việc với Python. Python, là một ngôn ngữ kiểu động, cho phép chúng ta thao tác với các đối tượng và thay đổi trạng thái của chúng trong quá trình thực thi chương trình. Tuy nhiên, không phải tất cả các đối tượng trong Python đều hoạt động theo cùng một cách khi sửa đổi. Một số đối tượng có thể được thay đổi, trong khi những đối tượng khác không đổi sau khi được tạo. Sự khác biệt cơ bản này giữa các đối tượng có thể thay đổi và không thể thay đổi tạo thành nền tảng cho triết lý thiết kế của Python. Bằng cách hiểu các khái niệm về tính có thể thay đổi và tính không thay đổi, các nhà phát triển có thể viết mã hiệu quả hơn, đáng tin cậy hơn và không có lỗi. Trong bài viết này, chúng ta sẽ khám phá khái niệm về tính có thể thay đổi và tính không thay đổi trong Python, hiểu sự khác biệt của chúng và xem xét ý nghĩa của chúng trong các tình huống lập trình thực tế.

Có thể thay đổi và không thể thay đổi trong Python

Trong Python, thuật ngữ “có thể thay đổi” và “bất biến” đề cập đến khả năng thay đổi của một đối tượng sau khi nó được tạo.

Một đối tượng được coi là có thể thay đổi nếu trạng thái hoặc giá trị của nó có thể được sửa đổi sau khi nó được tạo. Điều này có nghĩa là bạn có thể thay đổi dữ liệu hoặc thuộc tính bên trong của nó mà không cần tạo đối tượng mới. Ví dụ về các đối tượng có thể thay đổi trong Python bao gồm danh sách, từ điển và bộ. Nếu bạn sửa đổi một đối tượng có thể thay đổi, mọi tham chiếu đến đối tượng đó sẽ phản ánh những thay đổi.

Cả hai trạng thái này đều không thể thiếu đối với cấu trúc dữ liệu Python. Nếu bạn muốn trở nên hiểu biết hơn về toàn bộ Cấu trúc dữ liệu Python, hãy xem phần này khóa học miễn phí bao gồm nhiều cấu trúc dữ liệu trong Python bao gồm cấu trúc dữ liệu Tuple là bất biến. Bạn cũng sẽ nhận được chứng chỉ khi hoàn thành, chứng chỉ này chắc chắn sẽ tăng thêm giá trị cho danh mục đầu tư của bạn.

Đột biến là gì?

Có thể thay đổi là khi một cái gì đó có thể thay đổi hoặc có khả năng thay đổi. Trong Python, 'có thể thay đổi' là khả năng đối tượng thay đổi giá trị của chúng. Đây thường là những đối tượng lưu trữ một bộ sưu tập dữ liệu.

Bất biến là gì?

Bất biến là khi không thể thay đổi theo thời gian. Trong Python, nếu giá trị của một đối tượng không thể thay đổi theo thời gian, thì nó được gọi là bất biến. Sau khi được tạo, giá trị của các đối tượng này là vĩnh viễn.

Danh sách các đối tượng Mutable và Immutable

Các đối tượng của loại dựng sẵn có thể thay đổi là:

  • Chức năng
  • bộ
  • Từ điển
  • Các lớp do người dùng xác định (Hoàn toàn phụ thuộc vào người dùng để xác định các đặc điểm) 

Các đối tượng của loại tích hợp không thay đổi là:

  • Số (Số nguyên, Số hữu tỷ, Số thực, Số thập phân, Số phức & Booleans)
  • Strings
  • bộ dữ liệu
  • Bộ đông lạnh
  • Các lớp do người dùng xác định (Hoàn toàn phụ thuộc vào người dùng để xác định các đặc điểm)

Khả năng thay đổi đối tượng là một trong những đặc điểm khiến Python trở thành ngôn ngữ được gõ động. Mặc dù có thể thay đổi và không thể thay đổi trong Python là một khái niệm rất cơ bản, đôi khi nó có thể hơi khó hiểu do tính chất nội tại của tính bất biến.

Các đối tượng trong Python

Trong Python, mọi thứ được coi là một đối tượng. Mọi đối tượng đều có ba thuộc tính sau:

  • Danh tính – Điều này đề cập đến địa chỉ mà đối tượng đề cập đến trong bộ nhớ của máy tính.
  • Loại – Điều này đề cập đến loại đối tượng được tạo. Ví dụ: số nguyên, danh sách, chuỗi, v.v. 
  • Giá trị - Điều này đề cập đến giá trị được lưu trữ bởi đối tượng. Ví dụ – List=[1,2,3] sẽ giữ các số 1,2 và 3

Mặc dù không thể thay đổi ID và Loại sau khi đã tạo, nhưng các giá trị có thể thay đổi đối với các đối tượng Có thể thay đổi.

Hãy kiểm tra này khóa học chứng chỉ python miễn phí để bắt đầu với Python.

Các đối tượng có thể thay đổi trong Python

Tôi tin rằng, thay vì đi sâu vào các khía cạnh lý thuyết về khả năng thay đổi và bất biến trong Python, một đoạn mã đơn giản sẽ là cách tốt nhất để mô tả ý nghĩa của nó trong Python. Do đó, chúng ta hãy thảo luận từng bước mã dưới đây:

#Tạo danh sách chứa tên các thành phố của Ấn Độ  

cities = [‘Delhi’, ‘Mumbai’, ‘Kolkata’]

# In các phần tử từ danh sách các thành phố, được phân tách bằng dấu phẩy & dấu cách

for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(cities))) Output [2]: 0x1691d7de8c8

#Thêm một thành phố mới vào danh sách các thành phố

cities.append(‘Chennai’)

#In các thành phần từ danh sách các thành phố, được phân tách bằng dấu phẩy & dấu cách 

for city in cities: print(city, end=’, ’) Output [3]: Delhi, Mumbai, Kolkata, Chennai

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(cities))) Output [4]: 0x1691d7de8c8

Ví dụ trên cho chúng ta thấy rằng chúng ta có thể thay đổi trạng thái bên trong của đối tượng 'các thành phố' bằng cách thêm một thành phố 'Chennai' vào nó, tuy nhiên, địa chỉ bộ nhớ của đối tượng không thay đổi. Điều này xác nhận rằng chúng tôi đã không tạo một đối tượng mới, thay vào đó, cùng một đối tượng đã được thay đổi hoặc thay đổi. Do đó, chúng ta có thể nói rằng đối tượng là một loại danh sách có tên biến tham chiếu 'các thành phố' là một ĐỐI TƯỢNG CÓ THỂ THAY ĐỔI.

Bây giờ chúng ta hãy thảo luận về thuật ngữ IMMUTABLE. Xem xét rằng chúng tôi đã hiểu mutable là viết tắt của từ gì, rõ ràng là định nghĩa của immutable sẽ bao gồm 'KHÔNG' trong đó. Đây là định nghĩa đơn giản nhất của immutable– Một đối tượng mà trạng thái bên trong của nó KHÔNG thể thay đổi được là IMMUTABLE.

Một lần nữa, nếu bạn cố gắng và tập trung vào các thông báo lỗi khác nhau, bạn đã gặp phải, do IDE tương ứng ném ra; bạn sử dụng, bạn sẽ có thể xác định các đối tượng bất biến trong Python. Chẳng hạn, hãy xem xét đoạn mã dưới đây và thông báo lỗi liên quan đến nó, trong khi cố gắng thay đổi giá trị của Tuple tại chỉ mục 0. 

#Tạo Tuple với tên biến 'foo'

foo = (1, 2)

#Thay đổi giá trị chỉ mục[0] từ 1 thành 3

foo[0] = 3 TypeError: 'tuple' object does not support item assignment 

Đối tượng bất biến trong Python

Một lần nữa, một mã đơn giản sẽ là cách tốt nhất để mô tả ý nghĩa của bất biến. Do đó, chúng ta hãy thảo luận từng bước mã dưới đây:

#Tạo Tuple chứa tên tiếng Anh của các ngày trong tuần

weekdays = ‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’

# In các phần tử của tuple ngày trong tuần

print(weekdays) Output [1]: (‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’)

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(weekdays))) Output [2]: 0x1691cc35090

#tuples là bất biến, vì vậy bạn không thể thêm các phần tử mới, do đó, sử dụng hợp nhất các bộ dữ liệu với toán tử # + để thêm một ngày tưởng tượng mới trong tuple 'các ngày trong tuần'

weekdays += ‘Pythonday’,

#In các phần tử của tuple ngày trong tuần

print(weekdays) Output [3]: (‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’, ‘Pythonday’)

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(weekdays))) Output [4]: 0x1691cc8ad68 

Ví dụ trên cho thấy rằng chúng ta có thể sử dụng cùng một tên biến đang tham chiếu đến một đối tượng là một loại bộ dữ liệu có bảy phần tử trong đó. Tuy nhiên, ID hoặc vị trí bộ nhớ của bộ cũ và bộ mới không giống nhau. Chúng tôi không thể thay đổi trạng thái bên trong của đối tượng 'các ngày trong tuần'. Trình quản lý chương trình Python đã tạo một đối tượng mới trong địa chỉ bộ nhớ và tên biến 'các ngày trong tuần' bắt đầu tham chiếu đối tượng mới có tám phần tử trong đó. Do đó, chúng ta có thể nói rằng đối tượng là một loại bộ dữ liệu có tên biến tham chiếu 'các ngày trong tuần' là một ĐỐI TƯỢNG BẤT ĐỊNH.

Cũng đọc: Hiểu về Phân tích dữ liệu khám phá (EDA) trong Python

Bạn có thể sử dụng các đối tượng có thể thay đổi và bất biến ở đâu:

Các đối tượng có thể thay đổi có thể được sử dụng ở nơi bạn muốn cho phép mọi cập nhật. Ví dụ: bạn có một danh sách tên nhân viên trong tổ chức của mình và danh sách đó cần được cập nhật mỗi khi một thành viên mới được tuyển dụng. Bạn có thể tạo một danh sách có thể thay đổi và nó có thể được cập nhật dễ dàng.

Tính bất biến cung cấp rất nhiều ứng dụng hữu ích cho các tác vụ nhạy cảm khác nhau mà chúng tôi thực hiện trong môi trường tập trung vào mạng nơi chúng tôi cho phép xử lý song song. Bằng cách tạo các đối tượng bất biến, bạn niêm phong các giá trị và đảm bảo rằng không có luồng nào có thể ghi đè/cập nhật dữ liệu của bạn. Điều này cũng hữu ích trong trường hợp bạn muốn viết một đoạn mã không thể sửa đổi. Ví dụ: mã gỡ lỗi cố gắng tìm giá trị của một đối tượng không thay đổi.

Lưu ý: Bản chất không chuyển tiếp của Tính bất biến:

ĐƯỢC RỒI! Bây giờ chúng ta đã hiểu các đối tượng có thể thay đổi và bất biến trong Python là gì. Hãy tiếp tục và thảo luận về sự kết hợp của hai điều này và khám phá các khả năng. Hãy thảo luận xem nó sẽ hoạt động như thế nào nếu bạn có một đối tượng bất biến chứa (các) đối tượng có thể thay đổi? Hoặc ngược lại? Một lần nữa chúng ta hãy sử dụng một đoạn mã để hiểu hành vi này–

#tạo bộ dữ liệu (đối tượng không thay đổi) chứa 2 danh sách (có thể thay đổi) làm thành phần của nó

#Các phần tử (danh sách) chứa tên, tuổi & giới tính 

person = (['Ayaan', 5, 'Male'], ['Aaradhya', 8, 'Female'])

# in tuple

print(person) Output [1]: (['Ayaan', 5, 'Male'], ['Aaradhya', 8, 'Female']) 

#in vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(person))) Output [2]: 0x1691ef47f88

#Thay đổi tuổi cho phần tử đầu tiên. Chọn 1st phần tử của tuple bằng cách sử dụng lập chỉ mục [0] rồi 2nd phần tử của danh sách bằng cách sử dụng lập chỉ mục [1] và gán giá trị mới cho tuổi là 4

person[0][1] = 4

# in bộ dữ liệu đã cập nhật

print(person) Output [3]: (['Ayaan', 4, 'Male'], ['Aaradhya', 8, 'Female'])

#in vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(person))) Output [4]: 0x1691ef47f88

Trong đoạn mã trên, bạn có thể thấy rằng đối tượng 'person' là bất biến vì nó là một loại bộ dữ liệu. Tuy nhiên, nó có hai danh sách là thành phần của nó và chúng ta có thể thay đổi trạng thái của danh sách (danh sách có thể thay đổi). Vì vậy, ở đây chúng tôi đã không thay đổi tham chiếu đối tượng bên trong Tuple, nhưng đối tượng được tham chiếu đã bị thay đổi.

Cũng đọc: Phát hiện đối tượng thời gian thực bằng TensorFlow

Tương tự như vậy, hãy khám phá xem nó sẽ hoạt động như thế nào nếu bạn có một đối tượng có thể thay đổi chứa một đối tượng không thể thay đổi? Một lần nữa chúng ta hãy sử dụng mã để hiểu hành vi–

#tạo một danh sách (đối tượng có thể thay đổi) chứa các bộ dữ liệu (không thể thay đổi) dưới dạng các phần tử của nó

list1 = [(1, 2, 3), (4, 5, 6)]

#in danh sách

print(list1) Output [1]: [(1, 2, 3), (4, 5, 6)] 

#in vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(list1))) Output [2]: 0x1691d5b13c8	

#thay đổi tham chiếu đối tượng tại chỉ mục 0

list1[0] = (7, 8, 9)

#in danh sách

Output [3]: [(7, 8, 9), (4, 5, 6)]

#in vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(list1))) Output [4]: 0x1691d5b13c8

Là một cá nhân, nó hoàn toàn phụ thuộc vào bạn và yêu cầu của bạn về loại cấu trúc dữ liệu bạn muốn tạo với sự kết hợp của các đối tượng có thể thay đổi và không thể thay đổi. Tôi hy vọng rằng thông tin này sẽ giúp bạn trong khi quyết định loại đối tượng bạn muốn chọn trong tương lai.

Trước khi tôi kết thúc cuộc thảo luận của chúng ta về TÍNH BẤT ĐỊNH, cho phép tôi sử dụng từ 'CAVITE' khi chúng ta thảo luận về Chuỗi và Số nguyên. Có một ngoại lệ và bạn có thể thấy một số kết quả đáng ngạc nhiên trong khi kiểm tra tính trung thực cho tính bất biến. Ví dụ:
#tạo đối tượng kiểu số nguyên có giá trị 10 và tên biến tham chiếu 'x' 

x = 10

#in giá trị của 'x'

print(x) Output [1]: 10

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(x))) Output [2]: 0x538fb560 

#tạo đối tượng kiểu số nguyên có giá trị 10 và tên biến tham chiếu 'y'

y = 10

#in giá trị của 'y'

print(y) Output [3]: 10

# In vị trí của đối tượng được tạo trong địa chỉ bộ nhớ ở định dạng thập lục phân

print(hex(id(y))) Output [4]: 0x538fb560

Theo thảo luận và hiểu biết của chúng tôi, cho đến nay, địa chỉ bộ nhớ cho x & y phải khác, vì 10 là một thể hiện của lớp Số nguyên không thay đổi. Tuy nhiên, như trong đoạn mã trên, nó có cùng địa chỉ bộ nhớ. Đây không phải là điều mà chúng tôi mong đợi. Có vẻ như những gì chúng ta đã hiểu và thảo luận, cũng có một ngoại lệ.

Kiểm tra nhanhCấu trúc dữ liệu Python

Tính bất biến của Tuple

Các bộ dữ liệu là bất biến và do đó không thể có bất kỳ thay đổi nào trong chúng khi chúng được tạo bằng Python. Điều này là do chúng hỗ trợ các hoạt động trình tự giống như chuỗi. Chúng ta đều biết rằng các chuỗi là bất biến. Toán tử chỉ mục sẽ chọn một phần tử từ một bộ giống như trong một chuỗi. Do đó, chúng là bất biến.

Ngoại lệ trong tính bất biến

Giống như tất cả, có những ngoại lệ về tính bất biến trong python. Không phải tất cả các đối tượng bất biến đều thực sự có thể thay đổi. Điều này sẽ dẫn đến rất nhiều nghi ngờ trong tâm trí của bạn. Chúng ta hãy lấy một ví dụ để hiểu điều này.

Hãy xem xét một tuple 'tup'.

Bây giờ, nếu chúng ta xem xét tuple tup = ('Học giỏi',[4,3,1,2]) ;

Chúng tôi thấy rằng bộ dữ liệu có các phần tử thuộc các kiểu dữ liệu khác nhau. Phần tử đầu tiên ở đây là một chuỗi mà như chúng ta đều biết là không thay đổi trong tự nhiên. Phần tử thứ hai là một danh sách mà tất cả chúng ta đều biết là có thể thay đổi. Bây giờ, tất cả chúng ta đều biết rằng bản thân bộ dữ liệu là một kiểu dữ liệu bất biến. Nó không thể thay đổi nội dung của nó. Tuy nhiên, danh sách bên trong nó có thể thay đổi nội dung của nó. Vì vậy, giá trị của các đối tượng Immutable không thể thay đổi nhưng các đối tượng cấu thành của nó thì có thể. thay đổi giá trị của nó.

[Nhúng nội dung]

Kết luận

Hiểu các khái niệm về tính có thể thay đổi và tính không thay đổi trong Python là điều cần thiết đối với bất kỳ nhà phát triển nào đang tìm cách viết mã mạnh mẽ và hiệu quả. Bằng cách nhận ra sự khác biệt giữa các đối tượng có thể thay đổi và không thể thay đổi, các lập trình viên có thể đưa ra quyết định sáng suốt về thao tác đối tượng, quản lý bộ nhớ và tối ưu hóa mã. Các đối tượng có thể thay đổi có thể được sửa đổi sau khi tạo, cho phép linh hoạt và thuận tiện, đồng thời đặt ra những rủi ro tiềm ẩn như tác dụng phụ ngoài ý muốn hoặc hành vi không mong muốn. Mặt khác, các đối tượng bất biến vẫn không đổi sau khi được tạo, đảm bảo khả năng dự đoán, an toàn luồng và khả năng sử dụng chúng làm khóa trong từ điển. Bằng cách tận dụng lợi thế của các đối tượng có thể thay đổi và không thể thay đổi, các nhà phát triển có thể thiết kế mã sạch hơn, dễ bảo trì hơn và tránh những cạm bẫy phổ biến liên quan đến khả năng thay đổi của đối tượng. Cuối cùng, sự hiểu biết vững chắc về tính có thể thay đổi và tính không thay đổi trong Python giúp các nhà phát triển viết mã hiệu quả, không có lỗi, đáp ứng các yêu cầu của ứng dụng của họ.

Hiểu Mutable và Immutable trong Python Câu Hỏi Thường Gặp

1. Sự khác biệt giữa khả biến và bất biến trong Python?

đối tượng có thể thay đổi Đối tượng bất biến
Trạng thái của đối tượng có thể được sửa đổi sau khi nó được tạo. Trạng thái của đối tượng không thể được sửa đổi sau khi nó được tạo.
Chúng không phải là chủ đề an toàn. Họ là chủ đề an toàn
Các lớp có thể thay đổi không phải là lớp cuối cùng. Điều quan trọng là làm cho lớp cuối cùng trước khi tạo một đối tượng bất biến.

2. Các kiểu dữ liệu có thể thay đổi và bất biến trong Python là gì?

  • Một số kiểu dữ liệu có thể thay đổi trong Python là:

danh sách, từ điển, tập hợp, các lớp do người dùng định nghĩa.

  • Một số loại dữ liệu bất biến là: 

int, float, thập phân, bool, chuỗi, tuple, phạm vi.

3. Danh sách có thể thay đổi trong Python không?

Danh sách trong Python là kiểu dữ liệu có thể thay đổi vì các phần tử của danh sách có thể được sửa đổi, các phần tử riêng lẻ có thể được thay thế và thứ tự của các phần tử có thể được thay đổi ngay cả sau khi danh sách đã được tạo.
(Các ví dụ liên quan đến danh sách đã được thảo luận trước đó trong blog này.)

4. Tại sao các bộ được gọi là các kiểu bất biến?

Cấu trúc dữ liệu bộ và danh sách rất giống nhau, nhưng một điểm khác biệt lớn giữa các kiểu dữ liệu là danh sách có thể thay đổi, trong khi bộ dữ liệu là bất biến. Lý do cho tính bất biến của bộ dữ liệu là một khi các phần tử được thêm vào bộ dữ liệu và bộ dữ liệu đã được tạo; nó vẫn không thay đổi.

Một lập trình viên sẽ luôn thích xây dựng một mã có thể được sử dụng lại thay vì tạo lại toàn bộ đối tượng dữ liệu. Tuy nhiên, mặc dù các bộ dữ liệu là bất biến, giống như danh sách, chúng có thể chứa bất kỳ đối tượng Python nào, kể cả các đối tượng có thể thay đổi.

5. Các bộ có thể thay đổi trong Python không?

Tập hợp là tập hợp kiểu dữ liệu không có thứ tự có thể lặp lại, có thể được sử dụng để thực hiện các phép toán (như hợp, giao, hiệu, v.v.). Mỗi phần tử trong một tập hợp là duy nhất và không thay đổi, nghĩa là không có giá trị trùng lặp nào ở đó và không thể thay đổi giá trị. Tuy nhiên, chúng ta có thể thêm hoặc xóa các mục khỏi tập hợp vì bản thân tập hợp có thể thay đổi.

6. Các chuỗi có thể thay đổi trong Python không?

Các chuỗi không thể thay đổi trong Python. Chuỗi là một kiểu dữ liệu không thể thay đổi, có nghĩa là giá trị của nó không thể được cập nhật.

Tham gia các khóa học trực tuyến miễn phí của Great Learning Academy và nâng cấp kỹ năng của bạn ngay hôm nay.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img