2.2. Biến và các kiểu dữ liệu cơ bản

Một biến là tên bạn gán cho một giá trị bằng toán tử =. Sau khi gán, tên đó có thể được sử dụng ở bất kỳ đâu mà giá trị có thể:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

Phía bên phải của = được đánh giá trước, sau đó kết quả được gán cho tên ở bên trái. Đọc một tên chưa bao giờ được gán sẽ sinh ra NameError.

Một biến chỉ là một nhãn. Nó trỏ đến một giá trị -- giá trị nằm ở nơi khác, và cùng một giá trị có thể có bất kỳ số lượng nhãn nào.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

Biến là các nhãn trỏ đến các giá trị. Gán lại một biến di chuyển nhãn; nó không thay đổi giá trị mà nhãn đó từng trỏ đến.

2.2.1. Quy tắc đặt tên

  • Tên bắt đầu bằng chữ cái hoặc dấu gạch dưới và có thể chứa chữ cái, chữ số và dấu gạch dưới. frame_count_internal là hợp lệ; 1st_frame là lỗi cú pháp.

  • Tên phân biệt chữ hoa và thường: Widthwidth là hai biến khác nhau.

  • Tránh tái sử dụng các tên dựng sẵn như list, str, id(), hoặc print() -- che khuất chúng không gây ra lỗi, nhưng phần tử dựng sẵn gốc trở nên không thể truy cập trong phần còn lại của tập lệnh.

  • Quy ước: snake_case cho biến và hàm, ALL_CAPS cho hằng số bạn không có ý định thay đổi, CamelCase cho tên lớp.

2.2.2. Các kiểu dữ liệu cơ bản

Mỗi giá trị trong Python có một kiểu xác định các phép toán nó hỗ trợ. Bốn kiểu bạn sẽ viết nhiều nhất là:

  • int -- số nguyên, dương hoặc âm. Số nguyên MicroPython lớn tùy theo bộ nhớ cho phép. Literal được viết dưới dạng các chữ số đơn thuần: 0, 42, -7. Literal hex (0x1A), bát phân (0o17) và nhị phân (0b1010) cũng hợp lệ và hữu ích cho thanh ghi và bitmask.

  • float -- số có dấu thập phân hoặc số mũ: 3.14, 1.0, -0.5, 2e6 (= 2.000.000,0). Tất cả float trên camera đều là IEEE 754 32-bit -- chính xác đến khoảng bảy chữ số có nghĩa.

  • bool -- một trong hai literal True hoặc False (lưu ý viết hoa).

  • str -- văn bản, viết là các ký tự giữa dấu nháy đơn hoặc kép: "hello", 'OpenMV'. Cả hai kiểu nháy đều tương đương; chọn loại nào cho phép bạn tránh thoát các ký tự nháy xuất hiện bên trong chuỗi.

Có thêm một giá trị thứ năm đáng biết ngay lập tức:

  • None -- giá trị duy nhất của kiểu NoneType. Được dùng để có nghĩa là "không có giá trị" hoặc "chưa được đặt". Các hàm không trả về bất cứ thứ gì một cách tường minh sẽ ngầm trả về None.

2.2.3. Kiểm tra và chuyển đổi kiểu

Hàm dựng sẵn type() trả về kiểu của bất kỳ giá trị nào:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

Mỗi kiểu cũng hoạt động như một hàm chuyển đổi. Truyền vào một giá trị thuộc kiểu khác và bạn nhận lại giá trị tương đương của kiểu mới -- khi việc chuyển đổi được xác định rõ ràng:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

Các chuyển đổi không được xác định rõ ràng sẽ sinh ra ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. Gán lại và kiểu động

Một tên có thể được gán lại cho một giá trị thuộc bất kỳ kiểu nào bất kỳ lúc nào. Đoạn sau đây là hợp lệ:

x = 42
x = "now I'm a string"
x = 3.14

Python không ràng buộc một biến với một kiểu. Mã phụ thuộc vào x là số nguyên đơn giản chỉ mong đợi một số nguyên tại điểm sử dụng nó; nếu nó nhận được thứ gì đó khác, bạn sẽ nhận được TypeError lúc chạy.

Ghi chú

Gán lại x không thay đổi giá trị mà ràng buộc cũ trỏ đến. Nếu hai tên cùng chia sẻ một giá trị, việc gán lại một tên không ảnh hưởng đến tên kia:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

Thay đổi một giá trị được chia sẻ là khác biệt: một phương thức như list.append thay đổi giá trị mà ràng buộc trỏ đến, vì vậy mọi tên khác trỏ đến cùng giá trị đó đều thấy sự thay đổi.