Các đối tượng bất biến trong Python là gì?

Để thành thạo một lập trình viên Python phải thành thạo một số kỹ năng. Trong số đó là sự hiểu biết về khái niệm đối tượng có thể thay đổi so với đối tượng không thể thay đổi. Đây là một chủ đề quan trọng, vì nếu không chú ý đến nó, các lập trình viên có thể tạo ra các lỗi không mong muốn và tinh vi trong chương trình của họ

Như đã mô tả ở trên, các đối tượng có thể thay đổi cơ bản nhất của nó có thể được thay đổi và các đối tượng không thể thay đổi không thể thay đổi. Đây là một mô tả đơn giản, nhưng để hiểu đúng, chúng ta cần một ngữ cảnh nhỏ. Hãy khám phá điều này trong ngữ cảnh của các kiểu dữ liệu Python

Có thể thay đổi so với. Kiểu dữ liệu bất biến

Nơi đầu tiên mà một lập trình viên có khả năng gặp phải biến đổi so với. các đối tượng bất biến là với các kiểu dữ liệu Python.  

Dưới đây là các loại dữ liệu phổ biến nhất mà các lập trình viên gặp phải lúc đầu và liệu chúng có thể thay đổi hay không thay đổi [đây không phải là danh sách đầy đủ; Python có một số loại dữ liệu khác]

Data typeMutable or Immutable?
>>> our_list1[0] = 'toast'
9immutable
>>> our_list1
['toast', 'eggs']
0immutable
>>> our_list1
['toast', 'eggs']
1immutable
>>> our_list1
['toast', 'eggs']
2mutable
>>> our_list1
['toast', 'eggs']
3immutable
>>> our_list1
['toast', 'eggs']
4mutable
>>> our_list1
['toast', 'eggs']
5immutable

Hãy thử nghiệm với một vài trong số này trong trình bao Python và quan sát tính có thể thay đổi/bất biến của chúng.   

Trước tiên, hãy thử nghiệm với danh sách, danh sách này có thể thay đổi được. Chúng tôi sẽ bắt đầu bằng cách tạo một danh sách

>>> our_list1 = ['spam', 'eggs']

Bây giờ, hãy thử thay đổi danh sách bằng phép gán cắt lát

>>> our_list1[0] = 'toast'

Bây giờ hãy xem danh sách của chúng tôi và xem nó đã thay đổi chưa

>>> our_list1
['toast', 'eggs']

Thật vậy, nó có

Bây giờ, hãy thử nghiệm với các số nguyên, số nguyên này sẽ không thay đổi. Chúng tôi sẽ bắt đầu bằng cách gán một số nguyên cho biến của chúng tôi

>>> our_int1 = 3
>>> our_int1
3

Bây giờ hãy thử thay đổi nó

>>> our_int1 = 42
>>> our_int1
42

Nó đã thay đổi. Nếu bạn đã từng làm việc với Python thì điều này sẽ không làm bạn ngạc nhiên.  

Vậy theo nghĩa nào thì một số nguyên là bất biến?

Hóa ra hai trường hợp thực sự khác nhau

  • Trong trường hợp danh sách, biến vẫn chứa danh sách ban đầu nhưng danh sách đã bị sửa đổi.  
  • Trong trường hợp số nguyên, số nguyên ban đầu đã bị xóa hoàn toàn và được thay thế bằng số nguyên mới

Mặc dù điều này có vẻ trực quan trong ví dụ này, nhưng không phải lúc nào nó cũng rõ ràng như chúng ta sẽ thấy sau.  

Nhiều người trong chúng ta bắt đầu hiểu các biến là nơi chứa dữ liệu. Thực tế, nơi dữ liệu được lưu trữ trong bộ nhớ, phức tạp hơn một chút.  

Hàm

>>> our_list1
['toast', 'eggs']
6 của Python sẽ giúp chúng ta hiểu rằng.   

Tìm kiếm dưới mui xe. hàm id[]

Cách hiểu thông thường về các biến là nơi chứa dữ liệu không hoàn toàn đúng. Trong thực tế, các biến chứa các tham chiếu đến nơi dữ liệu được lưu trữ, thay vì chính dữ liệu thực tế

Mọi đối tượng hoặc dữ liệu trong Python đều có một giá trị số nguyên định danh và hàm

>>> our_list1
['toast', 'eggs']
7 sẽ cho chúng ta thấy định danh đó [id]

Trên thực tế, id đó là vị trí bộ nhớ [ảo hóa] nơi lưu trữ dữ liệu đó.  

Hãy thử các ví dụ trước của chúng tôi và sử dụng hàm

>>> our_list1
['toast', 'eggs']
7 để xem điều gì đang xảy ra trong bộ nhớ

🛑 Lưu ý. lưu ý rằng nếu bạn tự thử điều này, vị trí bộ nhớ của bạn sẽ khác

>>> our_list1 = ['spam', 'eggs']
>>> id[our_list1]
139946630082696

Vì vậy, có một danh sách tại vị trí bộ nhớ

>>> our_list1
['toast', 'eggs']
9.  

Bây giờ, hãy thay đổi danh sách bằng phép gán cắt lát

>>> our_list1[0] = 'toast'
>>> our_list1
['toast', 'eggs']
>>> id[our_list1]
139946630082696

Vị trí bộ nhớ được tham chiếu bởi

>>> our_int1 = 3
>>> our_int1
3
0 vẫn là
>>> our_list1
['toast', 'eggs']
9. Danh sách cũ vẫn còn đó, nó chỉ được sửa đổi

Bây giờ, hãy lặp lại thí nghiệm số nguyên của chúng ta, một lần nữa sử dụng hàm

>>> our_list1
['toast', 'eggs']
7 để xem điều gì đang xảy ra trong bộ nhớ

>>> our_int1 = 3
>>> our_int1
3
>>> id[our_int1]
9079072

Vì vậy, số nguyên 3 được lưu trữ tại vị trí bộ nhớ 9079072. Bây giờ hãy thử thay đổi nó

>>> our_int1 = 42
>>> our_int1
42
>>> id[our_int1]
9080320

Vì vậy,

>>> our_int1 = 3
>>> our_int1
3
3 đã không xóa số nguyên
>>> our_int1 = 3
>>> our_int1
3
4 khỏi vị trí bộ nhớ
>>> our_int1 = 3
>>> our_int1
3
5 và thay thế nó bằng số nguyên
>>> our_int1 = 3
>>> our_int1
3
6 tại vị trí
>>> our_int1 = 3
>>> our_int1
3
5.  

Thay vào đó, nó đang tham chiếu đến một vị trí bộ nhớ hoàn toàn mới.  

Vị trí bộ nhớ

>>> our_int1 = 3
>>> our_int1
3
5 không bị thay đổi, nó được thay thế hoàn toàn bằng vị trí bộ nhớ
>>> our_int1 = 3
>>> our_int1
3
9. Đối tượng ban đầu, số nguyên 3, vẫn ở vị trí
>>> our_int1 = 3
>>> our_int1
3
5.  

Tùy thuộc vào loại đối tượng cụ thể, nếu nó không còn được sử dụng nữa thì cuối cùng nó sẽ bị xóa hoàn toàn khỏi bộ nhớ bởi quy trình thu gom rác của Python. Chúng tôi sẽ không đi sâu vào mức độ chi tiết đó trong bài viết này – may mắn là Python đã giải quyết vấn đề này cho chúng tôi và chúng tôi không cần phải lo lắng về điều đó.  

Chúng tôi đã học danh sách có thể được sửa đổi. Vì vậy, đây là một câu đố nhỏ dành cho bạn. Hãy thử sửa đổi biến danh sách của chúng ta theo một cách khác

>>> our_list1 = ['spam', 'eggs']
>>> id[our_list1]
139946630082696
>>> our_list1  = ['toast', 'eggs']
>>> our_list1
['toast', 'eggs']
>>> id[our_list1]

Bạn nghĩ id sẽ là gì?

>>> our_list1[0] = 'toast'
0

Ồ, một id mới

Python đã không sửa đổi danh sách ban đầu, nó đã thay thế nó bằng một danh sách hoàn toàn mới.  

Vì vậy, danh sách có thể được sửa đổi, nếu việc gán phần tử được thực hiện, nhưng nếu thay vào đó, danh sách được gán cho biến, danh sách cũ sẽ được thay thế bằng danh sách mới.  

Nhớ. Điều gì xảy ra với một danh sách, cho dù được sửa đổi hay thay thế, tùy thuộc vào những gì bạn làm với nó

Tuy nhiên, nếu bạn không chắc điều gì đang xảy ra, bạn luôn có thể sử dụng hàm

>>> our_list1
['toast', 'eggs']
7 để tìm hiểu

Có thể thay đổi so với. Đối tượng bất biến

Vì vậy, chúng tôi đã khám phá khả năng biến đổi trong Python cho các loại dữ liệu.  

Tuy nhiên, khái niệm này không chỉ áp dụng cho các loại dữ liệu – nó áp dụng cho tất cả các đối tượng trong Python.  

Và như bạn có thể đã nghe, MỌI THỨ trong Python là một đối tượng

Chủ đề về đối tượng, lớp và lập trình hướng đối tượng rất rộng lớn và nằm ngoài phạm vi của bài viết này. Bạn có thể bắt đầu với phần giới thiệu về hướng đối tượng Python trong blog hướng dẫn này

  • Giới thiệu về các lớp học Python

Một số đối tượng có thể thay đổi và một số là bất biến. Một trường hợp đáng chú ý là các lớp và đối tượng do người lập trình tạo ra — nói chung chúng có thể thay đổi được

Sửa đổi "Bản sao" của một đối tượng có thể thay đổi

Điều gì xảy ra nếu chúng ta muốn sao chép một biến này sang biến khác để chúng ta có thể sửa đổi bản sao

>>> our_list1[0] = 'toast'
1

Trang phục thời tiết mưa của chúng tôi giống như trang phục bình thường của chúng tôi, nhưng chúng tôi muốn sửa đổi trang phục đi mưa của mình để thêm một chiếc ô. Trước khi làm, hãy sử dụng

>>> our_list1
['toast', 'eggs']
7 để kiểm tra kỹ hơn điều này

>>> our_list1[0] = 'toast'
2

Vì vậy, bản sao dường như thực sự là cùng một đối tượng với bản gốc. Hãy thử sửa đổi bản sao

>>> our_list1[0] = 'toast'
3

Vì vậy, những gì chúng tôi học được từ

>>> our_list1
['toast', 'eggs']
7 là đúng, “bản sao” của chúng tôi thực sự là cùng một đối tượng với bản gốc và việc sửa đổi “bản sao” sẽ sửa đổi bản gốc. Vì vậy hãy coi chừng điều này

Python cung cấp giải pháp cho vấn đề này thông qua mô-đun

>>> our_int1 = 42
>>> our_int1
42
4. Chúng tôi sẽ không kiểm tra vấn đề đó ở đây mà chỉ cần lưu ý về vấn đề này và biết rằng có sẵn giải pháp

💡 Lưu ý. các đối tượng bất biến hoạt động gần như giống nhau. Khi một giá trị không thay đổi được sao chép sang một biến thứ hai, cả hai thực sự tham chiếu đến cùng một đối tượng. Sự khác biệt đối với trường hợp bất biến là khi biến thứ hai được sửa đổi, nó sẽ nhận được một đối tượng hoàn toàn mới thay vì sửa đổi đối tượng ban đầu.

Rủi ro lỗi và sức mạnh. Các đối tượng có thể thay đổi trong hàm

Nếu bạn không cẩn thận, vấn đề chúng ta đã thấy trong phần trước, sửa đổi một “bản sao” của một biến, có thể xảy ra khi viết một hàm.  

Giả sử chúng ta đã viết một hàm để thực hiện thay đổi từ phần trước.  

Hãy viết một chương trình ngắn

>>> our_int1 = 42
>>> our_int1
42
5 bao gồm một chức năng như vậy

>>> our_list1[0] = 'toast'
4

Chúng tôi biết rằng dữ liệu được truyền vào hàm và giá trị được xử lý mới được trả về chương trình chính.  

Chúng ta cũng biết rằng biến được tạo trong hàm, tham số

>>> our_int1 = 42
>>> our_int1
42
6, sẽ bị hủy khi hàm kết thúc.  

Lý tưởng nhất là điều này cô lập hoạt động bên trong của hàm khỏi chương trình chính.   

Hãy xem kết quả thực tế từ chương trình [Một triển khai Linux được hiển thị. Việc triển khai Windows sẽ giống nhau, nhưng với một lời nhắc khác]

>>> our_list1[0] = 'toast'
5

Vì các biến

>>> our_int1 = 42
>>> our_int1
42
7 và
>>> our_int1 = 42
>>> our_int1
42
6 đều trỏ đến cùng một đối tượng có thể thay đổi, nên biến ___11_______7 được sửa đổi khi ___11_______6 được thêm vào, điều mà bạn có thể không chủ ý, dẫn đến một lỗi tiềm ẩn trong chương trình của bạn.  

Nếu các biến này trỏ đến một đối tượng bất biến, chẳng hạn như một bộ dữ liệu thì điều này sẽ không xảy ra. Tuy nhiên, xin lưu ý rằng các bộ dữ liệu không hỗ trợ nối thêm và thay vào đó, thao tác nối sẽ phải được thực hiện

Mặc dù chúng tôi đã chỉ ra một số rủi ro khi sử dụng danh sách trong một chức năng, nhưng cũng có sức mạnh.  

Các hàm có thể được sử dụng để sửa đổi danh sách trực tiếp và vì danh sách ban đầu được sửa đổi trực tiếp nên không cần câu lệnh

>>> our_list1 = ['spam', 'eggs']
>>> id[our_list1]
139946630082696
1 để trả lại giá trị cho chương trình chính

Tuple Mutable[?] ‘Gotcha’

Đây là một hành vi cuối cùng, có lẽ đáng ngạc nhiên, cần lưu ý. Chúng tôi đã đề cập rằng các bộ dữ liệu là bất biến.  

Hãy khám phá điều này xa hơn một chút với bộ dữ liệu sau

>>> our_list1[0] = 'toast'
6

Hãy thử sửa đổi điều này bằng cách thêm

>>> our_int1 = 3
>>> our_int1
3
4 vào danh sách mà nó chứa

>>> our_list1[0] = 'toast'
7

Bạn nghĩ cái gì xảy ra?

>>> our_list1[0] = 'toast'
8

Bộ dữ liệu của chúng tôi có thay đổi không? . Nó vẫn chứa cùng một danh sách – đó là danh sách trong bộ dữ liệu đã thay đổi.  

Bạn có thể thử hàm

>>> our_list1
['toast', 'eggs']
7 trên phần danh sách của bộ dữ liệu để xác nhận đó là cùng một danh sách

Tại sao phải bận tâm với Mutable vs. bất biến?

Tình huống có thể thay đổi/bất biến này có vẻ hơi phức tạp.  

Tại sao các nhà thiết kế Python làm điều này?

Cả thuộc tính có thể thay đổi và không thể thay đổi đều có ưu điểm và nhược điểm, do đó, tùy thuộc vào sở thích thiết kế

Lợi thế. Chẳng hạn, một lợi thế hiệu suất chính của việc sử dụng các kiểu dữ liệu không thay đổi thay vì có thể thay đổi là một số lượng lớn các biến tiềm năng có thể tham chiếu đến một đối tượng không thay đổi duy nhất mà không gặp rủi ro về các vấn đề phát sinh do làm lu mờ hoặc răng cưa. Nếu đối tượng có thể thay đổi, thì mỗi biến sẽ phải tham chiếu đến một bản sao của cùng một đối tượng, điều này sẽ gây ra chi phí bộ nhớ cao hơn nhiều

Những lựa chọn này bị ảnh hưởng bởi cách các đối tượng thường được sử dụng và những lựa chọn này ảnh hưởng đến hiệu suất của ngôn ngữ và chương trình. Các nhà thiết kế ngôn ngữ tính đến các yếu tố này khi đưa ra các lựa chọn đó.  

Xin lưu ý rằng các ngôn ngữ khác cũng đề cập đến chủ đề có thể thay đổi/bất biến, nhưng chúng không triển khai tất cả các thuộc tính này theo cùng một cách.  

Chúng tôi sẽ không đi vào chi tiết hơn về điều này trong bài viết này. Sự đánh giá cao của bạn về những lựa chọn này sẽ phát triển trong tương lai khi bạn có thêm kinh nghiệm về lập trình

Phần kết luận

  • Chúng tôi đã lưu ý rằng Python làm cho một số đối tượng của nó có thể thay đổi được và một số không thể thay đổi được.  
  • Chúng tôi đã khám phá điều này có nghĩa là gì và một số hậu quả thực tế của việc này là gì.  
  • Chúng tôi đã lưu ý đây là hệ quả của cách các đối tượng được lưu trữ trong bộ nhớ và
  • Chúng tôi đã giới thiệu hàm
    >>> our_list1
    ['toast', 'eggs']
    6 của Python như một cách để theo dõi việc sử dụng bộ nhớ này tốt hơn

Các ngôn ngữ lập trình cấp cao là một nỗ lực không ngừng cải tiến để làm cho việc lập trình trở nên dễ dàng hơn, giải phóng các lập trình viên để tạo ra phần mềm tuyệt vời mà không cần phải vật lộn với các chi tiết nhỏ như máy tính nhìn thấy.  

Nhận thức được cách các đối tượng có thể thay đổi và không thể thay đổi được xử lý trong bộ nhớ là một trường hợp nhận thức rõ hơn một chút về các chi tiết của máy tính sẽ gặt hái được phần thưởng. Hãy ghi nhớ những chi tiết này và đảm bảo chương trình của bạn hoạt động tốt nhất

Ví dụ về các loại bất biến trong Python là gì?

Kiểu dữ liệu bất biến là những kiểu dữ liệu có giá trị không thể sửa đổi sau khi chúng được tạo. Ví dụ về các loại dữ liệu bất biến là int, str, bool, float, tuple , v.v.

Đối tượng nào là bất biến?

Trong lập trình hướng đối tượng và lập trình hàm, một đối tượng bất biến [đối tượng không thể thay đổi] là một đối tượng mà trạng thái của nó không thể thay đổi được sau khi nó được tạo ra . Điều này trái ngược với một đối tượng có thể thay đổi [changeable object], có thể được sửa đổi sau khi nó được tạo ra.

Sự khác biệt giữa các đối tượng có thể thay đổi và bất biến trong Python là gì?

Sự khác biệt chính giữa các đối tượng có thể thay đổi và không thể thay đổi trong Python là các đối tượng có thể thay đổi có thể được sửa đổi hoặc thay đổi sau khi tạo nhưng các đối tượng không thể thay đổi không thể được sửa đổi sau khi tạo. Điều này làm cho các đối tượng bất biến trở thành đối tượng cuối cùng

Những kiểu dữ liệu nào trong Python là bất biến?

Các kiểu dữ liệu bất biến của Python là. .
Trôi nổi
Tuple
Phức tạp
Chuỗi
Bộ Stringfrozen [ lưu ý. phiên bản bất biến của bộ]
byte

Chủ Đề