2014-12-18 29 views
50

Tôi thấy một số mâu thuẫn khi sử dụng sys.getsizeof về danh sách giống hệt nhau. (Python 2.7.5)Tại sao tạo danh sách từ danh sách làm cho danh sách lớn hơn?

>>> lst = [0,1,2,3,4,5,6,7,8,9] 
>>> sys.getsizeof(lst) 
76 
>>> lst2 = list(lst) 
>>> sys.getsizeof(lst2) 
104 
>>> lst3 = list(lst2) 
>>> sys.getsizeof(lst3) 
104 
>>> sys.getsizeof(lst[:]) 
76 
>>> sys.getsizeof(lst2[:]) 
76 

Có ai có giải thích đơn giản không?

+7

Tôi đoán, được hỗ trợ bởi không có bằng chứng nào: danh sách phân bổ bộ nhớ thừa trước thời hạn, do đó các hoạt động 'append' trong tương lai có khấu hao O (1) phức tạp. Có lẽ sự khác biệt về kích thước là do số lượng bộ nhớ phân bổ bổ sung khác nhau. – Kevin

+0

@Kevin, bạn có thể đúng khi sử dụng 'lst2 = lst [:]' trả về cùng kích thước –

Trả lời

54

Với danh sách theo nghĩa đen, máy ảo tạo danh sách có độ dài đã đặt. Khi chuyển một chuỗi tới hàm tạo list(), các phần tử được thêm từng cái một (thông qua list.extend()) và như vậy danh sách được thay đổi kích thước khi thích hợp. Vì tổng số resize operation để phân bổ chi phí, danh sách cuối cùng thường sẽ lớn hơn danh sách nguồn.

+0

Tôi cảm thấy xấu hổ vì không tự mình tìm ra điều này. Cảm ơn! –

+0

bạn có thể giải thích thêm một chút nữa không? * Kể từ khi hoạt động thay đổi kích thước tổng thể để phân bổ chi phí, danh sách cuối cùng thường sẽ lớn hơn danh sách nguồn * cảm ơn! – Kasramvd

+0

@Kasra: Nếu bạn thêm 3 dấu cách nhưng chỉ điền vào 1 dấu cách thì điểm đến sẽ có thêm 2 dấu cách so với nguồn. –

11

Khi bạn tạo một danh sách theo nghĩa đen, kích thước được báo cáo là kích thước tối thiểu cần thiết để giữ dữ liệu. Bạn có thể thấy điều này vì kích thước tăng lên nếu bạn nối thêm một phần tử. Tuy nhiên, khi bạn sử dụng list để sao chép nó, nó phân bổ một số không gian thừa - phải mất một vài phụ thêm trước khi nó tái phân bổ (trong trường hợp của bạn, tôi nghi ngờ phụ lục thứ 8 sẽ làm điều đó - nó cần thêm 4 byte cho mỗi phần tử). Có lẽ có một lý do tại sao những hành vi phân bổ này khác nhau, nhưng tôi không chắc đó là những gì.

+1

Cảm ơn bạn đã đề xuất 'append' để có được cái nhìn sâu sắc về cấu trúc bên trong, nó rất hữu ích. –

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