Kiểu dữ liệu đã đặt có thể thay đổi trong Python không?

Mọi thứ trong Python đều là đối tượng. Và điều mà mọi người mới làm quen với Python nên nhanh chóng học được là tất cả các đối tượng trong Python có thể thay đổi hoặc không thay đổi

Hãy đi sâu hơn vào chi tiết của nó… Vì mọi thứ trong Python đều là Đối tượng, nên mọi biến đều chứa một thể hiện đối tượng. Khi một đối tượng được bắt đầu, nó được gán một id đối tượng duy nhất. Loại của nó được xác định trong thời gian chạy và một khi được đặt không bao giờ có thể thay đổi, tuy nhiên trạng thái của nó có thể thay đổi nếu nó có thể thay đổi. Nói một cách đơn giản, một đối tượng có thể thay đổi có thể được thay đổi sau khi nó được tạo và một đối tượng không thể thay đổi không thể

Các đối tượng của các loại dựng sẵn như (int, float, bool, str, tuple, unicode) là bất biến. Các đối tượng của các loại dựng sẵn như (list, set, dict) có thể thay đổi. Các lớp tùy chỉnh thường có thể thay đổi. Để mô phỏng tính bất biến trong một lớp, người ta nên ghi đè cài đặt và xóa thuộc tính để tăng ngoại lệ

Bây giờ đến câu hỏi, làm cách nào để biết biến của chúng ta là đối tượng có thể thay đổi hay không thay đổi. Đối với điều này, chúng ta nên hiểu chức năng 'ID' và 'TYPE' dùng để làm gì

ID và LOẠI

Hàm tích hợp id() trả về danh tính của một đối tượng dưới dạng số nguyên. Số nguyên này thường tương ứng với vị trí của đối tượng trong bộ nhớ, mặc dù điều này là dành riêng cho việc triển khai Python và nền tảng đang được sử dụng. Toán tử is so sánh danh tính của hai đối tượng

Hàm tích hợp type() trả về loại đối tượng. Hãy xem xét một ví dụ đơn giản

''' Example 1 '''
>>> x = "Holberton"
>>> y = "Holberton"
>>> id(x)
140135852055856
>>> id(y)
140135852055856
>>> print(x is y) '''comparing the types'''
True
''' Example 2 '''
>>> a = 50
>>> type(a)

>>> b = "Holberton"
>>> type(b)

Bây giờ chúng ta đã thấy cách so sánh hai biến chuỗi đơn giản để tìm ra kiểu và id. Vì vậy, sử dụng hai hàm này, chúng ta có thể kiểm tra xem các loại đối tượng khác nhau được liên kết với các biến như thế nào và các đối tượng có thể được thay đổi như thế nào

Đối tượng có thể thay đổi và không thể thay đổi

Vì vậy, như chúng ta đã thảo luận trước đó, một đối tượng có thể thay đổi có thể thay đổi trạng thái hoặc nội dung của nó và các đối tượng không thay đổi thì không thể.

đối tượng có thể thay đổi

danh sách, dict, thiết lập, mảng byte

đối tượng bất biến

int, float, phức tạp, chuỗi, tuple, bộ cố định [lưu ý. phiên bản không thay đổi của tập hợp], byte

Một ví dụ thực tế để tìm ra khả năng thay đổi của các loại đối tượng

x = 10x = y

Chúng tôi đang tạo một đối tượng kiểu int. định danh x và y trỏ đến cùng một đối tượng

id(x) == id(y)id(y) == id(10)

nếu chúng ta làm một thao tác đơn giản

x = x + 1

Bây giờ

id(x) != id(y)id(x) != id(10)

Đối tượng trong đó x được gắn thẻ được thay đổi. đối tượng 10 không bao giờ được sửa đổi. Đối tượng bất biến không cho phép sửa đổi sau khi tạo

Trong trường hợp các đối tượng có thể thay đổi

m = list([1, 2, 3])n = m

Chúng tôi đang tạo một đối tượng kiểu danh sách. định danh m và m được gắn thẻ cho cùng một đối tượng danh sách, là tập hợp của 3 đối tượng int bất biến

id(m) == id(n)

Bây giờ bật một mục từ đối tượng danh sách sẽ thay đổi đối tượng,

m.pop()

id đối tượng sẽ không bị thay đổi

id(m) == id(n)

m và n sẽ trỏ đến cùng một đối tượng danh sách sau khi sửa đổi. Đối tượng danh sách bây giờ sẽ chứa [1, 2]

Vì vậy, những gì chúng ta đã thấy cho đến nay từ các ví dụ trên?

  • Python xử lý các đối tượng có thể thay đổi và bất biến khác nhau
  • Bất biến được truy cập nhanh hơn các đối tượng có thể thay đổi
  • Các đối tượng có thể thay đổi rất tốt để sử dụng khi bạn cần thay đổi kích thước của đối tượng, danh sách ví dụ, dict, v.v. Immutables được sử dụng khi bạn cần đảm bảo rằng đối tượng bạn tạo sẽ luôn giữ nguyên
  • Các đối tượng bất biến về cơ bản là tốn kém để “thay đổi”, bởi vì làm như vậy liên quan đến việc tạo một bản sao. Thay đổi các đối tượng có thể thay đổi là rẻ
Ngoại lệ trong tính bất biến

Không phải tất cả các đối tượng bất biến đều thực sự bất biến. Bối rối?

Như đã thảo luận trước đó, các bộ chứa Python thích các bộ dữ liệu là bất biến. Điều đó có nghĩa là giá trị của một

x = 10x = y
1 không thể thay đổi sau khi nó được tạo. Nhưng "giá trị" của một bộ thực tế là một chuỗi các tên với các ràng buộc không thể thay đổi đối với các đối tượng. Điều quan trọng cần lưu ý là các ràng buộc không thể thay đổi, không phải các đối tượng mà chúng bị ràng buộc

Chúng ta hãy xem xét một bộ t = (‘holberton’, [1, 2, 3])

Bộ dữ liệu t ở trên chứa các phần tử thuộc các kiểu dữ liệu khác nhau, phần tử đầu tiên là một chuỗi bất biến và phần tử thứ hai là một danh sách có thể thay đổi. Bản thân bộ dữ liệu không thể thay đổi. tôi. e. nó không có bất kỳ phương pháp nào để thay đổi nội dung của nó. Tương tự như vậy, chuỗi là bất biến vì chuỗi không có bất kỳ phương thức thay đổi nào. Nhưng đối tượng danh sách có các phương thức biến đổi, vì vậy nó có thể được thay đổi. Đây là một điểm tinh tế, nhưng dù sao cũng quan trọng. “giá trị” của một đối tượng bất biến không thể thay đổi, nhưng các đối tượng cấu thành thì có thể

Cách các đối tượng được chuyển đến Hàm

Điều quan trọng là chúng ta phải biết sự khác biệt giữa các loại có thể thay đổi và không thể thay đổi cũng như cách chúng được xử lý khi được truyền vào các hàm. Hiệu quả bộ nhớ bị ảnh hưởng nhiều khi các đối tượng thích hợp được sử dụng

Ví dụ: nếu một đối tượng có thể thay đổi được gọi theo tham chiếu trong một hàm, thì nó có thể tự thay đổi biến ban đầu. Do đó để tránh điều này, biến ban đầu cần được sao chép sang biến khác. Các đối tượng bất biến có thể được gọi theo tham chiếu vì giá trị của nó không thể thay đổi được

x = 10x = y
0

Như chúng ta có thể thấy từ ví dụ trên, chúng ta đã gọi danh sách thông qua cuộc gọi theo tham chiếu, vì vậy các thay đổi được thực hiện đối với chính danh sách ban đầu

Hãy xem một ví dụ khác

x = 10x = y
0

Trong ví dụ trên, cùng một đối tượng được truyền vào hàm, nhưng giá trị biến không thay đổi mặc dù đối tượng giống hệt nhau. Điều này được gọi là vượt qua giá trị. Vì vậy, chính xác những gì đang xảy ra ở đây? . Vì vậy, biến tham chiếu đối tượng không bị thay đổi, nhưng bản thân đối tượng đang bị thay đổi nhưng chỉ trong phạm vi chức năng. Do đó sự thay đổi không được phản ánh

Loại dữ liệu nào có thể thay đổi trong Python?

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

Loại dữ liệu nào không thể thay đổi trong Python?

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 và các lớp do người dùng định nghĩa. Mặt khác, một số kiểu dữ liệu không thể thay đổi là int, float, decimal, bool, string, tuple và range