Trích dẫn từ Data Model
Đối tượng là trừu tượng Python cho dữ liệu. Tất cả dữ liệu trong một chương trình Python được đại diện bởi các đối tượng hoặc theo quan hệ giữa các đối tượng. (Trong một nghĩa nào đó, và trong sự phù hợp với mô hình của một Von Neumann “lưu trữ máy tính chương trình,” mã cũng được đại diện bởi các đối tượng.)
Từ quan điểm của Python, Fundamental data type về cơ bản là khác nhau từ C/C++ . Nó được sử dụng để ánh xạ các loại dữ liệu C/C++
tới Python. Và vì vậy chúng ta hãy để nó từ cuộc thảo luận trong thời gian này và xem xét thực tế rằng tất cả các dữ liệu là đối tượng và là biểu hiện của một số lớp. Mỗi đối tượng có một ID (giống như địa chỉ), Value và một Type.
Tất cả các đối tượng đều được sao chép theo tham chiếu. Ví dụ:
>>> x=20
>>> y=x
>>> id(x)==id(y)
True
>>>
Cách duy nhất để có một trường hợp mới là tạo một.
>>> x=3
>>> id(x)==id(y)
False
>>> x==y
False
Điều này nghe có vẻ phức tạp lúc đầu nhưng để đơn giản hóa một chút, Python đã thực hiện một số loại không thay đổi. Ví dụ: bạn không thể thay đổi số string
. Bạn phải cắt nó và tạo một đối tượng chuỗi mới.
Thường sao chép theo tham chiếu sẽ cho kết quả không mong muốn cho ví dụ cũ.
x=[[0]*8]*8
có thể cho bạn cảm giác rằng nó tạo danh sách hai chiều là 0
s. Nhưng trên thực tế nó tạo ra một danh sách tham chiếu của cùng một đối tượng danh sách [0] s. Vì vậy, làm x [1] [1] sẽ kết thúc thay đổi tất cả các trường hợp trùng lặp cùng một lúc.
Mô-đun Copy cung cấp một phương pháp gọi là sâu để tạo ra một thể hiện mới của đối tượng chứ không phải là một cá thể cạn. Điều này có lợi khi bạn dự định có hai đối tượng riêng biệt và thao tác nó một cách riêng biệt giống như bạn dự định trong ví dụ thứ hai của mình.
Để mở rộng ví dụ của bạn
>>> class Klasa:
def __init__(self, num):
self.num = num
>>> a = Klasa(2)
>>> b = copy.deepcopy(a)
>>> print a.num, b.num # prints 2 2
2 2
>>> a.num = 3
>>> print a.num, b.num # prints 3 3 - different!
3 2
Bên ngoài ngôn ngữ Python, các điều khoản theo tham chiếu/theo giá trị đã bị nhầm lẫn và gây nhầm lẫn. Bên trong Python, có mô hình dữ liệu và mô hình thực thi rất đặc biệt, các thuật ngữ này vẫn còn nhiều nhầm lẫn và khó hiểu và cần tránh. Đó là ý kiến của tôi, nhưng lưu ý tôi không phải là một chuyên gia về Python. Xem (http://stackoverflow.com/a/986145/551449) và nhiều bài đăng và blog khác về chủ đề này. Có vẻ như bạn cần nghiên cứu thêm một chút về các mô hình dữ liệu và thực thi của Python – eyquem