Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëPythonÁбíµÄÄÚ²¿ÊµÏÖ
 
À´Ô´£ºPython¿ª·¢Õß ·¢²¼ÓÚ2017-6-26
  3017  次浏览      28
 

±¾ÎĽ«½éÉÜÁбíÔÚ CPythonÖеÄʵÏÖ£¬ÒòΪ±Ï¾¹Cpython ÓÖÊÇ Python ×îΪ³£ÓõÄʵÏÖ¡£

Python ÖеÄÁбí·Ç³£Ç¿´ó£¬¿´¿´ËüµÄÄÚ²¿ÊµÏÖ»úÖÆÊÇÔõôÑùµÄ£¬Ò»¶¨·Ç³£ÓÐȤ¡£

ÏÂÃæÊÇÒ»¶Î Python ½Å±¾£¬ÔÚÁбíÖÐÌí¼Ó¼¸¸öÕûÊý£¬È»ºó´òÓ¡ÁÐ±í¡£

>>> l = []

>>> l.append(1)

>>> l.append(2)

>>> l.append(3)

>>> l

[1, 2, 3]

>>> for e in l:

... print e

...

¿ÉÒÔ·¢ÏÖ£¬ÁбíÊÇÒ»¸öµü´úÆ÷¡£

Áбí¶ÔÏóµÄ C ÓïÑԽṹÌå

Cpython ÖеÄÁбíʵÏÖÀàËÆÓÚÏÂÃæµÄ C ½á¹¹Ìå¡£ob_item ÊÇÖ¸ÏòÁбí¶ÔÏóµÄÖ¸ÕëÊý×é¡£allocated ÊÇÉêÇëÄÚ´æµÄ²ÛµÄ¸öÊý¡£

typedef struct {

PyObject_VAR_HEAD

PyObject **ob_item;

Py_ssize_t allocated;

} PyListObject;

Áбí³õʼ»¯

¿´¿´³õʼ»¯Ò»¸ö¿ÕÁбíµÄʱºò·¢ÉúÁËʲô£¬ÀýÈ磺l = []¡£

arguments: size of the list = 0

returns: list object = []

PyListNew:

nbytes = size * size of global Python object = 0

allocate new list object

allocate list of pointers (ob_item) of size nbytes = 0

clear ob_item

set list's allocated var to 0 = 0 slots

return list object

Òª·ÖÇåÁбí´óСºÍ·ÖÅäµÄ²Û´óС£¬ÕâºÜÖØÒª¡£ÁбíµÄ´óСºÍ len(l) µÄ´óСÏàͬ¡£·ÖÅä²ÛµÄ´óСÊÇÖ¸ÒѾ­ÔÚÄÚ´æÖзÖÅäÁ˵IJۿռäÊý¡£Í¨³£·ÖÅäµÄ²ÛµÄ´óСҪ´óÓÚÁбí´óС£¬ÕâÊÇΪÁ˱ÜÃâÿ´ÎÁбíÌí¼ÓÔªËØµÄʱºò¶¼µ÷Ó÷ÖÅäÄÚ´æµÄº¯Êý¡£ÏÂÃæ»á¾ßÌå½éÉÜ¡£

Append ²Ù×÷

ÏòÁбíÌí¼ÓÒ»¸öÕûÊý£ºl.append(1) ʱ·¢ÉúÁËʲô?µ÷ÓÃÁ˵ײãµÄ C º¯Êý app1()¡£

¼ÓÒ»¸öÕûÊý£ºl.append(1) ʱ·¢ÉúÁËʲô?µ÷ÓÃÁ˵ײãµÄ C º¯Êý app1()¡£
arguments: list object, new element

returns: 0 if OK, -1 if not

app1:

n = size of list

call list_resize() to resize the list to size n+1 = 0 + 1 = 1

list[n] = list[0] = new element

return 0

ÏÂÃæÊÇ list_resize() º¯Êý¡£Ëü»á¶àÉêÇëһЩÄڴ棬±ÜÃâÆµ·±µ÷Óà list_resize() º¯Êý¡£ÁбíµÄÔö³¤Ä£Ê½Îª£º0£¬4£¬8£¬16£¬25£¬35£¬46£¬58£¬72£¬88¡­¡­

arguments: list object, new size

returns: 0 if OK, -1 if not

list_resize:

new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) = 3

new_allocated += newsize = 3 + 1 = 4

resize ob_item (list of pointers) to size new_allocated

return 0

ÏÖÔÚ·ÖÅäÁË 4 ¸öÓÃÀ´×°ÁбíÔªËØµÄ²Û¿Õ¼ä£¬²¢ÇÒµÚÒ»¸ö¿Õ¼äÖÐΪÕûÊý 1¡£ÈçÏÂͼÏÔʾ l[0] Ö¸ÏòÎÒÃÇÐÂÌí¼ÓµÄÕûÊý¶ÔÏó¡£ÐéÏߵķ½¿ò±íʾÒѾ­·ÖÅ䵫ûÓÐʹÓõIJۿռ䡣

Áбí×·¼ÓÔªËØ²Ù×÷µÄƽ¾ù¸´ÔÓ¶ÈΪ O(1)¡£

¼ÌÐøÌí¼ÓеÄÔªËØ£ºl.append(2)¡£µ÷Óà list_resize º¯Êý£¬²ÎÊýΪ n+1 = 2£¬ µ«ÊÇÒòΪÒѾ­ÉêÇëÁË 4 ¸ö²Û¿Õ¼ä£¬ËùÒÔ²»ÐèÒªÔÙÉêÇëÄÚ´æ¿Õ¼ä¡£ÔÙÌí¼ÓÁ½¸öÕûÊýµÄÇé¿öÒ²ÊÇÒ»ÑùµÄ£ºl.append(3)£¬l.append(4)¡£ÏÂͼÏÔʾÁËÎÒÃÇÏÖÔÚµÄÇé¿ö¡£

Insert ²Ù×÷

ÔÚÁÐ±íÆ«ÒÆÁ¿ 1 µÄλÖòåÈëÐÂÔªËØ£¬ÕûÊý 5£ºl.insert(1,5)£¬ÄÚ²¿µ÷ÓÃins1() º¯Êý¡£

arguments: list object, where, new element

returns: 0 if OK, -1 if not

ins1:

resize list to size n+1 = 5 -> 4 more slots will be allocated

starting at the last element up to the offset where, right shift each element

set new element at offset where

return 0

ÐéÏߵķ½¿òÒÀ¾É±íʾÒѾ­·ÖÅ䵫ûÓÐʹÓõIJۿռ䡣ÏÖÔÚ·ÖÅäÁË 8 ¸ö²Û¿Õ¼ä£¬µ«ÊÇÁбíµÄ´óСȴֻÊÇ 5¡£

Áбí²åÈë²Ù×÷µÄƽ¾ù¸´ÔÓ¶ÈΪ O(n)¡£

Pop ²Ù×÷

È¡³öÁбí×îºóÒ»¸öÔªËØ ¼´l.pop()£¬µ÷ÓÃÁË listpop() º¯Êý¡£ÔÚ listpop() º¯ÊýÖлáµ÷Óà list_resize º¯Êý£¬Èç¹ûÈ¡³öÔªËØºóÁбíµÄ´óССÓÚ·ÖÅäµÄ²Û¿Õ¼äÊýµÄÒ»°ë£¬½«»áËõ¼õÁбíµÄ´óС¡£

arguments: list object

returns: element popped

listpop:

if list empty:

return null

resize list with size 5 - 1 = 4. 4 is not less than 8/2 so no shrinkage

set list object size to 4

return last element

Áбí pop ²Ù×÷µÄƽ¾ù¸´ÔÓ¶ÈΪ O(1)¡£

¿ÉÒÔ¿´µ½ pop ²Ù×÷ºó²Û¿Õ¼ä 4 ÒÀȻָÏòÔ­ÏȵÄÕûÊý¶ÔÏ󣬵«ÊÇ×îΪ¹Ø¼üµÄÊÇÏÖÔÚÁбíµÄ´óСÒѾ­±äΪ 4¡£

¼ÌÐø pop Ò»¸öÔªËØ¡£ÔÚ list_resize() º¯ÊýÖУ¬size ¨C 1 = 4 ¨C 1 = 3 ÒѾ­Ð¡ÓÚËù·ÖÅäµÄ²Û¿Õ¼ä´óСµÄÒ»°ë£¬ËùÒÔËõ¼õ·ÖÅäµÄ²Û¿Õ¼äΪ 6£¬Í¬Ê±ÏÖÔÚÁбíµÄ´óСΪ 3¡£

¿ÉÒÔ¿´µ½²Û¿Õ¼ä 3 ºÍ 4 ÒÀȻָÏòÔ­ÏȵÄÕûÊý£¬µ«ÊÇÏÖÔÚÁбíµÄ´óСÒѾ­±äΪ 3¡£

Remove ²Ù×÷

Python µÄÁбí¶ÔÏóÓиö·½·¨£¬É¾³ýÖ¸¶¨µÄÔªËØ£º l.remove(5)¡£µ×²ãµ÷Óà listremove() º¯Êý¡£

arguments: list object, element to remove

returns none if OK, null if not

listremove:

loop through each list element:

if correct element:

slice list between element's slot and element's slot + 1

return none

return null

ΪÁË×öÁбíµÄÇÐÆ¬²¢ÇÒɾ³ýÔªËØ£¬µ÷ÓÃÁË list_ass_slice() º¯Êý£¬ËüµÄʵÏÖ·½·¨±È½ÏÓÐȤ¡£ÎÒÃÇÔÚɾ³ýÁбíλÖà 1 µÄÔªËØ 5 µÄʱºò£¬µÍλµÄÆ«ÒÆÁ¿Îª 1 ͬʱ¸ßλµÄÆ«ÒÆÁ¿Îª 2.

arguments: list object, low offset, high offset

returns: 0 if OK

list_ass_slice:

copy integer 5 to recycle list to dereference it

shift elements from slot 2 to slot 1

resize list to 5 slots

return 0

Áбí remove ²Ù×÷µÄ¸´ÔÓ¶ÈΪ O(n)¡£

   
3017 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ