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
Trả lời
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ờ ! -).
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()
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. .
del
Hoặc None
chỉ của bạn bạn bè
>>> a = "Hello"
>>> a = None
Or
>>> del a
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. –
'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
- 1. Công cụ thu gom rác cho dalvik
- 2. Thu gom rác trễ?
- 3. Thu gom rác trong Perl
- 4. Buộc thu gom rác thải
- 5. đa và thu gom rác thải
- 6. Python: hành vi thu gom rác thải với ctypes
- 7. Khi nào đối tượng thu gom rác trong python?
- 8. Thông báo Thu gom Rác Bỏ lỡ
- 9. đế và bộ thu gom rác Đi
- 10. Buộc thu gom rác của mảng, C#
- 11. Thu gom rác - các nút gốc
- 12. Thông báo thu gom rác thải?
- 13. Tham khảo chéo và thu gom rác
- 14. Thời gian thu gom rác cực dài
- 15. Khi nào để thu gom rác
- 16. Hiệu quả của bộ thu gom rác .NET
- 17. Thu gom rác khi biên dịch sang C
- 18. Thu gom rác Java G1 trong sản xuất
- 19. Bộ thu gom rác cho đa lõi llvm?
- 20. Có thể ngừng thu gom rác thải .NET không?
- 21. Ràng buộc Lua với C++ và thu gom rác
- 22. Bộ sưu tập và chuỗi thu gom rác
- 23. Đối tượng COM này có bị thu gom rác không?
- 24. Tôi có thể thử nghiệm thu gom rác bằng cách nào?
- 25. tham chiếu nội bộ ngăn chặn việc thu gom rác
- 26. Bộ thu gom rác có gọi là Dispose() không?
- 27. Bộ sưu tập rác trong android (Thực hiện thủ công)
- 28. Thu gom rác của các thành viên tĩnh
- 29. Câu hỏi về Thu gom rác trong Java
- 30. Thu gom rác của các trường riêng tư
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
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. –
Ngay sau khi tôi hoàn thành danh hiệu, tôi dự định. – Casebash