2011-09-25 40 views
5

Tại sao"sys.getrefcount()" trở lại giá trị

sys.getrefcount() 

trở lại 3 cho mỗi số lượng lớn hoặc chuỗi đơn giản? Điều đó có nghĩa rằng 3 đối tượng cư trú ở đâu đó trong chương trình? Ngoài ra, tại sao không thiết lập x = (số lượng rất lớn) tăng số lượng ref của đối tượng? Làm 3 số ref đó là kết quả từ cuộc gọi của tôi đến getrefcount? Cảm ơn bạn đã làm rõ điều này.

ví dụ:

>>> sys.getrefcount(4234234555) 
3 
>>> sys.getrefcount("testing") 
3 
>>> sys.getrefcount(11111111111111111) 
3 
>>> x=11111111111111111 
>>> sys.getrefcount(11111111111111111) 
3 
+0

Mặc dù x = "test" tăng số ref, x = (số lớn) thì không. – kaiseroskilo

Trả lời

9

đối tượng số nguyên lớn không được tái sử dụng bởi những người thông dịch, vì vậy bạn sẽ có được hai đối tượng riêng biệt:

>>> a = 11111 
>>> b = 11111 
>>> id(a) 
40351656 
>>> id(b) 
40351704 

sys.getrefcount (11111) luôn trả về số tương tự vì nó đo đếm tài liệu tham khảo của một tươi vật.

Đối với số nguyên nhỏ, Python luôn tái sử dụng cùng một đối tượng:

>>> sys.getrefcount(1) 
73 

Thông thường, bạn sẽ nhận được chỉ có một tham chiếu đến một đối tượng mới:

>>> sys.getrefcount(object()) 
1 

Nhưng số nguyên được phân bổ trong một trước đặc biệt khu vực malloced bởi Python để tối ưu hóa hiệu suất, và tôi nghi ngờ hai tài liệu tham khảo bổ sung có một cái gì đó để làm với điều này.

Bạn có thể nhìn vào việc thực hiện C ở đây: http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

Chỉnh sửa: Tôi không yêu cầu bồi thường để hiểu những gì đang xảy ra trong chi tiết lowlevel, tôi nghĩ rằng có một số điều tại nơi làm việc mà bộ nhớ cache tài liệu tham khảo tạm thời:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
6
  1. dây nhỏ và số nguyên được lưu trữ bởi Python để tiết kiệm chi phí xây dựng đối tượng.

  2. Trình thông dịch Python tương tác giữ tham chiếu tạm thời cho từng chữ mà bạn nhập. So sánh getrefcount('foobar') với getrefcount('foo' + 'bar'). (Trong trường hợp sau, người phiên dịch có tham chiếu đến 'foo''bar'.)

  3. Từ manual:

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

+0

Vì vậy, nó là 1 cho bộ nhớ cache + 1 cho ref.What tạm thời thứ ba? Nó thuộc về nội bộ của Python? – kaiseroskilo

+2

@kaiseroskilo: không, nó là +2 để tham chiếu tạm thời; một cái trong tương tác toplevel và một trong 'getrefcount' chính nó vì đối tượng được truyền vào như một đối số. –

+0

Ok tôi nhận được nó ngay bây giờ! – kaiseroskilo

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