Phần này sẽ bắt đầu đề cập đến ngữ nghĩa cơ bản của ngôn ngữ Python. Trái ngược với cú pháp được đề cập trong phần trước, ngữ nghĩa của một ngôn ngữ liên quan đến ý nghĩa của các câu lệnh. Như với cuộc thảo luận về cú pháp của chúng ta, ở đây chúng ta sẽ xem trước một số cấu trúc ngữ nghĩa thiết yếu trong Python để cung cấp cho bạn hệ quy chiếu tốt hơn để hiểu mã trong các phần sau
Phần này sẽ đề cập đến ngữ nghĩa của các biến và đối tượng, đó là những cách chính để bạn lưu trữ, tham chiếu và thao tác trên dữ liệu trong tập lệnh Python
Biến Python là con trỏ¶
Gán biến trong Python dễ như đặt tên biến ở bên trái dấu bằng [
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list0]
# assign 4 to the variable x x = 4
Điều này có vẻ đơn giản, nhưng nếu bạn có mô hình tinh thần sai về hoạt động này, thì cách thức hoạt động của Python có vẻ khó hiểu. Chúng ta sẽ tìm hiểu ngắn gọn về điều đó ở đây
Trong nhiều ngôn ngữ lập trình, các biến tốt nhất nên được coi là thùng chứa hoặc bộ chứa mà bạn đặt dữ liệu vào đó. Vì vậy, trong C, chẳng hạn, khi bạn viết
// C code int x = 4;
về cơ bản, bạn đang xác định một "bộ nhớ" có tên là
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1 và đặt giá trị
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list2 vào đó. Ngược lại, trong Python, các biến tốt nhất không nên được coi là vùng chứa mà là con trỏ. Vì vậy, trong Python, khi bạn viết
x = 4
về cơ bản, bạn đang xác định một con trỏ có tên
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1 trỏ đến một số nhóm khác có chứa giá trị
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list2. Lưu ý một hậu quả của việc này. bởi vì các biến Python chỉ trỏ đến các đối tượng khác nhau, không cần phải "khai báo" biến hoặc thậm chí yêu cầu biến luôn trỏ đến thông tin cùng loại. Đây là ý nghĩa mà mọi người nói Python được gõ động. tên biến có thể trỏ đến các đối tượng thuộc bất kỳ loại nào. Vì vậy, trong Python, bạn có thể làm những việc như thế này
Trong 1]
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list
Mặc dù người dùng các ngôn ngữ được nhập tĩnh có thể bỏ lỡ kiểu an toàn đi kèm với các khai báo giống như trong C,
int x = 4;
kiểu gõ động này là một trong những phần giúp Python viết nhanh và dễ đọc
Có một hệ quả của cách tiếp cận "biến như con trỏ" này mà bạn cần lưu ý. Nếu chúng ta có hai tên biến trỏ đến cùng một đối tượng có thể thay đổi, thì việc thay đổi tên này cũng sẽ thay đổi tên kia. Ví dụ: hãy tạo và sửa đổi danh sách
Trong 2]
# assign 4 to the variable x x = 40
Chúng tôi đã tạo hai biến
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1 và
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list6, cả hai đều trỏ đến cùng một đối tượng. Do đó, nếu chúng tôi sửa đổi danh sách thông qua một trong các tên của nó, chúng tôi sẽ thấy rằng danh sách "khác" cũng sẽ được sửa đổi
Trong 3]
# assign 4 to the variable x x = 43
# assign 4 to the variable x x = 44
Trong [4]
# assign 4 to the variable x x = 45
# assign 4 to the variable x x = 46
Hành vi này có vẻ khó hiểu nếu bạn nghĩ sai về các biến là các thùng chứa dữ liệu. Nhưng nếu bạn đang nghĩ đúng về các biến là con trỏ tới đối tượng, thì hành vi này có ý nghĩa
Cũng lưu ý rằng nếu chúng ta sử dụng "
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list0" để gán giá trị khác cho
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1, điều này sẽ không ảnh hưởng đến giá trị của
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list6 – phép gán chỉ đơn giản là thay đổi đối tượng mà biến trỏ tới
Trong [5]
// C code int x = 4;0
# assign 4 to the variable x x = 46
Một lần nữa, điều này hoàn toàn hợp lý nếu bạn coi
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1 và
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list6 là con trỏ và toán tử "
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list0" là một phép toán thay đổi thứ mà tên trỏ tới
Bạn có thể thắc mắc liệu ý tưởng con trỏ này có làm cho các phép tính số học trong Python khó theo dõi hay không, nhưng Python được thiết lập để đây không phải là vấn đề. Số, chuỗi và các loại đơn giản khác là bất biến. bạn không thể thay đổi giá trị của chúng – bạn chỉ có thể thay đổi giá trị mà các biến trỏ tới. Vì vậy, ví dụ, hoàn toàn an toàn khi thực hiện các thao tác như sau
Trong [6]
// C code int x = 4;2
// C code int x = 4;3
Khi chúng tôi gọi
int x = 4;3, chúng tôi không sửa đổi giá trị của đối tượng
int x = 4;4 được chỉ ra bởi
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list1; . Vì lý do này, giá trị của
x = 1 # x is an integer x = 'hello' # now x is a string x = [1, 2, 3] # now x is a list6 không bị ảnh hưởng bởi hoạt động
Mọi thứ đều là đối tượng¶
Python là ngôn ngữ lập trình hướng đối tượng và trong Python mọi thứ đều là đối tượng
Hãy xác định điều này có nghĩa là gì. Trước đó chúng ta đã thấy rằng các biến chỉ đơn giản là con trỏ và bản thân tên biến không có thông tin kiểu đính kèm. Điều này khiến một số người tuyên bố sai rằng Python là ngôn ngữ không có kiểu. Nhưng đây không phải là trường hợp. Hãy xem xét những điều sau đây
Trong [7]
// C code int x = 4;4
Ra[7]
// C code int x = 4;5
Trong [8]
// C code int x = 4;6
Ra[8]
// C code int x = 4;7
Trong [9]
// C code int x = 4;8
Ra[9]
// C code int x = 4;9
Python có các loại;
Trong các ngôn ngữ lập trình hướng đối tượng như Python, một đối tượng là một thực thể chứa dữ liệu cùng với siêu dữ liệu và/hoặc chức năng được liên kết. Trong Python, mọi thứ đều là một đối tượng, có nghĩa là mọi thực thể đều có một số siêu dữ liệu [được gọi là thuộc tính] và chức năng liên quan [được gọi là phương thức]. Các thuộc tính và phương thức này được truy cập thông qua cú pháp dấu chấm
Ví dụ, trước đây chúng ta đã thấy rằng các danh sách có một phương thức
int x = 4;9, phương thức này sẽ thêm một mục vào danh sách và được truy cập thông qua cú pháp dấu chấm ["
# assign 4 to the variable x x = 400"]
Trong [10]
x = 40
x = 41
Mặc dù có thể mong đợi các đối tượng phức hợp như danh sách có các thuộc tính và phương thức, nhưng điều đôi khi bất ngờ là trong Python, ngay cả các kiểu đơn giản cũng có các thuộc tính và phương thức kèm theo. Ví dụ: các loại số có thuộc tính
# assign 4 to the variable x x = 401 và
# assign 4 to the variable x x = 402 trả về phần thực và phần ảo của giá trị, nếu được xem dưới dạng số phức
Trong [11]
x = 42
x = 43
Các phương thức giống như các thuộc tính, ngoại trừ chúng là các hàm mà bạn có thể gọi bằng cách sử dụng dấu ngoặc đơn mở và đóng. Ví dụ: số dấu phẩy động có một phương thức gọi là
# assign 4 to the variable x x = 403 để kiểm tra xem giá trị có phải là số nguyên không
Trong [12]
x = 44
Ra[12]
x = 45
Trong [13]
x = 46
Ra[13]
x = 47
Khi chúng tôi nói rằng mọi thứ trong Python là một đối tượng, chúng tôi thực sự muốn nói rằng mọi thứ đều là một đối tượng – ngay cả các thuộc tính và phương thức của các đối tượng cũng là các đối tượng có thông tin
# assign 4 to the variable x x = 404 của riêng chúng
Trong [14]
x = 48
Ra[14]
x = 49
Chúng ta sẽ thấy rằng sự lựa chọn thiết kế mọi thứ là đối tượng của Python cho phép một số cấu trúc ngôn ngữ rất thuận tiện