Published on

Biến và các kiểu dữ liệu trong python

Authors

I. Biến (variable)

Hầu hết khi làm quen với các ngôn ngữ lập trình đều có khái niệm biến. Biến là một đối tượng dùng để lưu trữ dữ liệu, các giá trị tạm thời để sử dụng trong chương trình đó. Dữ liệu có thể thay đổi giá trị trong quá trình thực thi chương trình.

test.py
x = 5
x = x + 1
y = "Hello"

Trong ví dụ trên x, y được gọi là các biến chứa dữ liệu. Biến x ban đầu được gán bằng 5 và sau đó tăng lên 1 chứng tỏ dữ liệu có thể thay đổi giá trị trong quá trình thực thi chương trình.
Biến trong python thường được viết dưới dạng snake_case.

test.py
my_int = 123
my_str = "Hello, World!"
print(type(my_int).__name__) # int
print(type(my_str).__name__) # str

Một đặc điểm của python là python sử dụng hệ thống kiểu duck typing (latent typing) tự động gán kiểu giống javascript. Vì vậy trong ví dụ trên my_int tự động được nhận biết là kiểu int và my_str tự động được nhận biết là kiểu str

II. Kiểu dữ liệu nguyên thuỷ (primitive data types)

  • Integers (số nguyên): Đại diện cho các số nguyên, ví dụ: 1, 100, -5
  • Floats (số thực): Đại diện cho các số thập phân, ví dụ: 3.14, -0.001, 2.0
  • Strings (chuỗi): Đại diện cho chuỗi ký tự, ví dụ: "Hello, World!", 'Python'.
  • Booleans: Chỉ đại diện cho hai giá trị True hoặc False (trong python là TrueFalse khác với các ngôn ngữ khác như javascript là true, false)

III. Kiểu dữ liệu collection (complex data types)

  • list
  • tuple
  • dict
  • set

Đặc điểm chung của những kiểu dữ liệu này là có tính iterable (có tính lặp)

Iterables Overview
ItemExampleDesc
List['Milk', 'Honey', 'Milk']Mutable, ordered list, duplicates allowed, mostly only one type
SetHoneyMutable, unorderd list, no duplicates, mostly only one type
Tuple('Milk', 'Honey')Immutable, orderded list, duplicates allowed, often mixed types
Dictionary{"a1": "one", "a2": "two", "a3": "three"}Mutable, unorderd map, no duplicate keys, often mixed types

Trong 4 kiểu dữ liệu complex chỉ có duy nhất tupleImmutable

IV. Một vài thao tác với các kiểu dữ liệu

1. Get type

test.py
print(type(123))    # <class 'int'>
print(type(123).__name__)    # 'int'

Khi sử dụng type(value) sẽ trả về class chứa kiểu dữ liệu Muốn trả về type dạng string hãy sử dụng type(value).__name__

2. Check type

sử dụng isinstance để check kiểu dữ liệu

test.py
a = True
print (isinstance(a, bool))

b = 123
print(isinstance(b, int))

3. Ép Kiểu

python hay bất kỳ ngôn ngữ nào khác đều có ép kiểu, chúng chỉ khác nhau về cú pháp

test.py
print(int("123"))
int()
float()
str()
bool()

4. Thao tác với số

test.py
a = 111222
b = 111_222
print(a == b)

Cách viết 111_222 nhìn phân cách các chữ số rõ ràng hơn

V. Object trong python

Trong Python, mọi thứ được xem là một đối tượng. Mọi đối tượng trong Python đều có các thuộc tính và phương thức riêng. mọi thứ, từ số, chuỗi, danh sách đến hàm và lớp đều được coi là đối tượng.

test.py
s = "Hello, World!"
print(s.upper())

Rõ ràng upper() như là một method trong OOP mà s là một instance của class

VI. Bản chất khi gán giá trị và function id()

1. Trong python có thể kiểm tra địa chỉ của biến thông qua function id()

test.py
a = 123
print(id(123)) # 140736605395192
print(id(a)) # 140736605395192
a += 1
print(id(a)) # 140736605395224

Cùng một biến a nhưng khi tăng giá trị thêm 1 thì nó lại có địa chỉ khác. Bản chất là bởi vì khi ta gán a = 123 thì nó sẽ cấp phát một ô nhớ trong bộ nhớ (memory) và ô nhớ đó có giá trị bằng 123. Khi ta tăng thêm 1 đơn vị, thì nó sẽ gán biến a cho ô nhớ có giá trị 124. Khi đó địa chỉ của biến a sẽ khác ban đầu.

2. Một ví dụ khác về id ()

test.py
x = 12
y = 12
z = 12
print(id(x))  # 140736605391640
print(id(y))  # 140736605391640
print(id(z))  # 140736605391640
print(id(12)) # 140736605391640

khi ta gán x = 12, thì nó sẽ cấp phát 1 ô nhớ trong bộ nhớ (memory) và ô nhớ đó có giá trị bằng 12. Khi các biến y được gán 12, và z gán bằng 12 thì nó ko cấp phát ô nhớ mới mà tận dụng ô nhớ đã được cấp phát

3. Immutable và Mutable

  • immutable là những đối tượng mà giá trị của chúng không thể thay đổi sau khi được tạo bao gồm: Integers, Floats, Strings, Booleans, và Tuple
test.py
x = 5
print(id(x)) # 140736605391416
x += 1
print(id(x)) # 140736605391448

Khi bạn thay đổi giá trị của một đối tượng immutable, Python tạo một đối tượng mới thay thế đối tượng cũ. Vì vậy địa chỉ của x đã thay đổi

  • mutable là những đối tượng mà giá trị của chúng có thể thay đổi sau khi được tạo bao gồm danh list, dictionary, set
test.py
my_list = [1, 2, 3]
print(id(my_list)) # 1791652532608
my_list.append(4)
print(id(my_list)) # 1791652532608

Khi bạn thay đổi giá trị của một đối tượng mutable, đối tượng đó thực sự thay đổi mà không tạo ra một đối tượng mới. Vì vậy địa chỉ của my_list không thay đổi

4. garbage collection

Python cũng giống như nhiều ngôn ngữ khác có cơ chế GC tự động xoá các đối tượng không được sử dụng trong bộ nhớ

test.py
x = 5
x += 1

Ví dụ ban đầu ta gán x = 5 thì sẽ cấp phát 1 ô nhớ trong bộ nhớ có giá trị bằng 5. Sau đó khi x được gán bằng 6 thì x sẽ được gán đến ô nhớ có giá trị mới. Ô nhớ bằng 5 vẫn tồn tại và gây lãng phí bộ nhớ. Tuy nhiên quá trình GC tự động đã giải quyết việc này tự động xóa các đối tượng không được sử dụng nữa.