2009-10-29 36 views
16

Có cách nào để xóa thủ công đối tượng mà bộ sưu tập rác không từ chối thoát khỏi ngay cả khi tôi gọi gc.collect()? Làm việc trong Python 3.0Thu gom rác thủ công bằng Python

+1

Không biết về Python nhưng một số nhà sưu tập rác đôi khi nghĩ nhầm rằng mọi thứ vẫn đang được sử dụng vì họ tìm thấy những gì * xuất hiện * để tham chiếu đến các đối tượng này (nhưng thực ra là không). Trong những trường hợp như vậy không có nhiều bạn có thể làm. – Artelius

+1

Ngoài ra, bạn nên chuyển sang Python 3.1 ASAP. 3.0 có một số vấn đề đã biết và không còn được hỗ trợ nữa. –

+2

Ngay sau khi tôi hoàn thành danh hiệu, tôi dự định. – Casebash

Trả lời

24

mỗi the docs, gc.get_referrers(thatobject) sẽ cho bạn biết tại sao đối tượng vẫn còn sống (làm điều đó ngay sau khi một gc.collect() để đảm bảo "liveness" không mong muốn sẽ liên tục). Sau đó, nó bằng cách nào đó của một nghệ thuật đen ;-). Bạn sẽ thường thấy rằng một số liên kết giới thiệu là danh sách (vì vậy tại sao danh sách đó đề cập đến thatobject? Bạn có thể .remove trong chế độ khẩn cấp, nhưng làm cho âm thanh mã bình thường trở nên tốt hơn ...) và thậm chí thường xuyên hơn, dict s (nhiều người trong số họ có thể là __dict__ s của một số cá thể lớp hoặc khác - thường không tầm thường để tìm ra cái nào ... một lần nữa, loại bỏ brute-force đôi khi là một giải pháp khẩn cấp, nhưng không bao giờ ! -).

1

Nó phụ thuộc vào những gì Python của bạn đang chạy. Here's good article giải thích chi tiết

Trích dẫn:

Trong phiên bản hiện tại của CPython, mỗi bài tập mới để x bên trong vòng lặp sẽ phát hành các tài nguyên được phân bổ trước đó. Sử dụng GC, điều này không được đảm bảo. Nếu bạn muốn viết mã sẽ làm việc với bất kỳ triển khai Python nào, bạn nên đóng tài nguyên một cách rõ ràng; điều này sẽ làm việc bất kể GC:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

Nếu GC từ chối để tiêu diệt nó, đó là bởi vì bạn có một tham chiếu đến nó ở đâu đó. Loại bỏ các tham chiếu và nó sẽ (cuối cùng) đi. Ví dụ:

myRef = None 

Hãy ghi nhớ rằng GC có thể không nhất thiết phá hủy đối tượng của bạn trừ khi nó cần.

Nếu đối tượng của bạn đang nắm giữ tài nguyên không thuộc quyền quản lý của Python (ví dụ, một số thủ thuật với mã C được gọi từ Python), đối tượng sẽ cung cấp cuộc gọi phát hành tài nguyên để bạn có thể thực hiện khi bạn muốn. .

4

del Hoặc None chỉ của bạn bạn bè

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

Không nhất thiết phải đúng. Các đối tượng chỉ cần được unreachable (hoặc có một refeab count đếm một cách dễ chịu, mà rất hy vọng đồng ý với cựu) để đủ điều kiện cho cải tạo. –

+5

'del a' không xóa đối tượng (chỉ cần ghi chú; không ngụ ý rằng bạn ngụ ý rằng) – hasen