2013-04-27 44 views
10

Tôi muốn biết cách hoạt động của len().Làm thế nào để chiều dài danh sách đếm Python

Tính từ đầu đến cuối danh sách mỗi khi tôi gọi len(), hoặc vì danh sách cũng là một lớp, len() chỉ trả về một biến trong đối tượng danh sách ghi lại độ dài của danh sách?

Ngoài ra, tôi hy vọng ai đó có thể cho tôi biết nơi tôi có thể tìm ra mã nguồn của các chức năng tích hợp như 'len()', 'bản đồ()', vv

+0

Nó gọi phương thức '__len__' của đối tượng danh sách. Bạn có thể xem nguồn ở đây: http://svn.python.org/view/python/tags/r27/Objects/listobject.c?view=markup – Blender

+0

nó theo dõi độ dài của nó để nó không kể lại mỗi lần .. –

+0

Và đây là nguồn của nội dung dựng sẵn: http://hg.python.org/releasing/2.7.4/file/9290822f2280/Python/bltinmodule.c#l928 – Blender

Trả lời

16

Tải mã Python 2.7 nguồn ở đây: http://www.python.org/getit/releases/2.7.4/

list được thực hiện trong ./Include/listobject.h./Objects/listobject.c.

typedef struct { 
    PyObject_VAR_HEAD 
    /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ 
    PyObject **ob_item; 

    /* ob_item contains space for 'allocated' elements. The number 
    * currently in use is ob_size. 
    * Invariants: 
    *  0 <= ob_size <= allocated 
    *  len(list) == ob_size 
    *  ob_item == NULL implies ob_size == allocated == 0 
    * list.sort() temporarily sets allocated to -1 to detect mutations. 
    * 
    * Items must normally not be NULL, except during construction when 
    * the list is not yet visible outside the function that builds it. 
    */ 
    Py_ssize_t allocated; 
} PyListObject; 

list.__len__() chỉ tư vấn ob_size, mà là một phần của PyObject_VAR_HEAD. Điều này làm cho len() hoạt động liên tục trong thời gian cho danh sách.

+0

Bạn có lẽ nên bao gồm PyObject_VAR_HEAD vì đó là phù hợp nhất. – jamylak

+0

Liên kết trực tiếp đến nguồn tệp tiêu đề: https://svn.python.org/projects/python/trunk/Include/listobject.h – hoju

1

Vâng, bạn có thể tìm thấy tài liệu về các hàm dựng sẵn here.

Loại dữ liệu list theo dõi số lượng phần tử đang giữ, len(list) là hoạt động O (1).


Đối với mã nguồn, bạn có thể tìm mã nguồn của Python tại the download page.

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