2012-04-24 37 views
12

Theo tôi được biết, sys.getrefcount() trả về số tài liệu tham khảo của một đối tượng, mà "nên" là 1 trong những trường hợp sau đây:Tại sao sys.getrefcount() trả về 2?

import sys,numpy 
a = numpy.array([1.2,3.4]) 
print sys.getrefcount(a) 

Tuy nhiên, nó hóa ra là 2! Vì vậy, nếu tôi:

del a 

Đối tượng "numpy.array ([1.2,3.4])" vẫn ở đó (không có bộ sưu tập rác)?

+1

Bạn có thể xây dựng một trình diễn đơn giản hơn: x = 1,1; print sys.getrefcount (x) –

Trả lời

20

Khi bạn gọi getrefcount(), tham chiếu được sao chép theo giá trị vào đối số của hàm, tạm thời tăng số lượng tham chiếu của đối tượng. Đây là nơi tham chiếu thứ hai đến từ.

này được giải thích trong documentation:

Số đếm trở nói chung là một cao hơn bạn có thể mong đợi, vì nó bao gồm (tạm thời) tham chiếu như một cuộc tranh cãi để getrefcount().

Đối với câu hỏi thứ hai của bạn:

Nếu tôi "del a", sẽ là "numpy.array ([1. 2,3,4]) "đối tượng vẫn còn đó (không có bộ sưu tập rác)?

Khi thời gian getrefcount() thoát, số tham chiếu của mảng sẽ quay lại 1 và sau đó del a sẽ giải phóng bộ nhớ.

+0

Nếu nó được "sao chép theo giá trị", sẽ không có tham chiếu thứ hai. Python chuyển đối số theo tham chiếu và không bao giờ sao chép các giá trị trừ khi được yêu cầu một cách rõ ràng. – bukzor

+0

@bukzor: Nếu bạn đọc kỹ câu trả lời, bạn sẽ thấy rằng các từ "theo giá trị" áp dụng cho từ "tham chiếu", mà bạn đã bỏ qua một cách thuận tiện từ trích dẫn của bạn. Có vẻ như bạn đã hiểu nhầm những gì tôi đang cố gắng nói. Thật không may, tôi không thấy cách tôi viết lại câu trả lời để cải thiện sự rõ ràng và chính xác; nếu bạn có bất kỳ đề xuất cụ thể nào, hãy cho tôi biết. – NPE

+2

Khi bạn gọi getrefcount(), các biến cục bộ của hàm đó tham chiếu đến đối số đã cho, tạm thời tăng số lượng tham chiếu của đối tượng. – bukzor

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