2013-02-14 34 views
6

Tôi đã đọc một số mã trong thư viện luồng tiêu chuẩn (Python 2.6) và có một đoạn mã khiến tôi tự hỏi. Nó có thể được rút ngắn để cơ cấu như sau (so sánh với phương pháp __bootstrap_inner trong threading.py):Xóa các biến trong thư viện chuẩn Python

def foo(): 
    exc_type, exc_value, exc_tb = sys.exc_info() 
    try: 
     # some code 
    except: 
     # some code 
    finally: 
     del exc_type, exc_value, exc_tb 

Các biến này không đi ra ngoài của foo phạm vi. Có lý do nào để xóa các tham chiếu này ở cuối không?

Trả lời

8

Có, ít nhất là đối với exc_tb; đối tượng traceback giữ một tham chiếu đến khung hiện tại, và điều đó làm cho một tham chiếu vòng tròn này.

Bằng cách xóa tham chiếu cục bộ bạn phá vỡ vòng kết nối đó, vì vậy bạn không phải hy vọng và tin tưởng rằng trình thu gom rác sẽ có thể.

Từ sys.exc_info() function docs:

Cảnh báo: Gán giá trị trả về traceback cho một biến địa phương trong một chức năng mà là xử lý một ngoại lệ sẽ gây ra một tham chiếu vòng tròn. Điều này sẽ ngăn chặn bất cứ điều gì được tham chiếu bởi một biến cục bộ trong cùng một hàm hoặc bởi truy nguyên từ việc thu thập rác. Vì hầu hết các chức năng không cần quyền truy cập vào truy nguyên, giải pháp tốt nhất là sử dụng một cái gì đó như exctype, value = sys.exc_info()[:2] để chỉ trích xuất loại ngoại lệ và giá trị. Nếu bạn cần truy nguyên, hãy đảm bảo xóa nó sau khi sử dụng (được thực hiện tốt nhất với tuyên bố try ... finally) hoặc gọi exc_info() trong một chức năng không tự xử lý ngoại lệ.

+0

Ah, tôi hiểu. Bằng cách nào đó tôi đã bỏ lỡ trong tài liệu. Cảm ơn bạn! – freakish

Các vấn đề liên quan