Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Garbage Collection (Thu gom rác) trong Python

Quản lý bộ nhớ trong Python rất đơn giản. Bạn không cần lo lắng về quản lý bộ nhớ vì cấp phát và giải phóng bộ nhớ là tự động. Một trong các cơ chế quản lý bộ nhớ là garbage collection (thu gom rác).

Garbage Collection là gì?

Là quá trình dọn dẹp bộ nhớ máy tính đang được sử dụng bởi một chương序 đang chạy khi chương trình đó không còn cần bộ nhớ đó. Với garbage collection, bộ nhớ được giải phóng có thể được sử dụng bởi chương trình khác.

Python sử dụng hai phương pháp quản lý bộ nhớ:

  • Reference counting (Đếm tham chiếu)
  • Garbage collection (Thu gom rác)

Garbage collection của Python là tự động, nhưng trong một số ngôn ngữ khác bạn phải tự dọn dẹp đối tượng. Trong Python, bạn cũng có thể xóa đối tượng thủ công nếu muốn.

>>> x = 9
>>> print(x)
9
>>> del x
>>> print(x)
Traceback (most recent call last):
  File "", line 1, in 
    print(x)
NameError: name 'x' is not defined

Trên đây: định nghĩa biến x, sử dụng, sau đó xóa đối tượng (vì trong Python mọi thứ đều là đối tượng) và cố gắng in ra.

Ở hai dòng đầu, đối tượng x được biết. Tuy nhiên, sau khi xóa đối tượng x, không thể in nó nữa.

Vậy garbage collection hoàn toàn tự động. Hiểu sâu hơn qua ví dụ sau. Mọi đối tượng trong Python (như x ở trên) có một reference count (số đếm tham chiếu) và một con trỏ đến kiểu dữ liệu.

Reference count thay đổi tùy theo cách sử dụng. Ví dụ: gán đối tượng x cho đối tượng y khác, reference count tăng lên 2.

>>> some_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> # Reference count của some_list = 1
>>> other_list = some_list
>>> # Reference count = 2
>>> # Cũng tăng nếu truyền đối tượng như một đối số
>>> list_total = sum(some_list)
>>> # Nếu đặt đối tượng vào một list, reference count cũng tăng
>>> list_of_list = [some_list, some_list, some_list]
>>> 
>>> # Kiểm tra reference count của đối tượng "some_list"
>>> import sys
>>> sys.getrefcount(some_list)
6

Ví dụ tốt để hiểu reference counting. Tạo đối tượng "some_list" (ref count = 1), gán cho đối tượng khác (ref count = 2), truyền làm đối số (ref count = 3), đặt vào list xuất hiện 3 lần (ref count = 6). Khi kiểm tra ref count của "some_list", kết quả là 6.

>>> import sys
>>> sys.getrefcount(some_list)
6
>>> 
>>> del list_of_list
>>> sys.getrefcount(some_list)
3
>>> del some_list
>>> sys.getrefcount(some_list)
Traceback (most recent call last):
  File "", line 1, in 
    sys.getrefcount(some_list)
NameError: name 'some_list' is not defined

Khi xóa list_of_list, ref count giảm xuống 3. Khi xóa some_list, đối tượng không còn tồn tại.