【Python从入门到精通】(六)Python内置的数据类型-列表(list)和元组(tuple),九浅一深,十个章节,不信你用不到* [+ Y* e$ [' D- h% N7 x4 M
" k/ Q* B9 g! D2 W& ^: l. V. O8 p' M文章目录; R+ H9 Z$ C l8 W1 ~
一浅: 列表(list)的介绍- B! N- U' t4 {+ u7 ]
二浅:列表的操作6 n8 \5 U! Q& Q5 O7 X1 U! j& M
三浅:向列表中新增元素 5 P* m1 H0 a2 B& B# c+ c0 K四浅:修改列表中的元素 1 q% f% L6 V3 V7 w# D( L& r7 N五浅:删除列表中的元素$ \ w8 y% T9 u- G5 n) H2 W
六浅:列表中元素的查找以及访问5 d9 c* K P8 r* v( v Y' c6 y
访问列表中的元素" J4 c i- U; j7 {
查找某个元素在列表中出现的位置 index(): L1 \! |' K2 O h$ E& `
七浅:列表使用技巧及注意事项 $ b7 R, g8 A7 y a& x! n7 GPython新增元素中各个方法的区别 ( g8 R; B: R9 V( x+ j- y八浅:元组(tuple)的介绍 1 _ D( I' a; ~6 L3 \8 t9 g元组的创建方式2 L( N, y! V/ t0 ~9 ^# ^
九浅:元组和列表的区别: W8 \7 W) W- Z3 f2 o
小结. V1 c. D' U& z% g0 `
一深:列表和元组的底层实现 $ n5 a q0 d& X D1 }; q总结4 Z( @5 M8 g: |, a/ E6 l3 x
一浅: 列表(list)的介绍 * u% U9 E, d4 T' A) O2 b, i列表作为Python序列类型中的一种,其也是用于存储多个元素的一块内存空间,这些元素按照一定的顺序排列。其数据结构是:5 Y/ s; g( \* S R; \/ M
( o: t d' r0 q8 ?
; J( u9 e, z8 X1 v[element1, element2, element3, ..., elementn]6 Y/ _! [, i/ b* D2 Z
11 ^7 e, [$ }; H, _" K* p N
element1~elementn表示列表中的元素,元素的数据格式没有限制,只要是Python支持的数据格式都可以往里面方。同时因为列表支持自动扩容,所以它可变序列,即可以动态的修改列表,即可以修改,新增,删除列表元素。看个爽图吧! ! I6 B- h+ H2 t! Q6 }0 A9 r. G6 f8 y& s' p) B
& V/ N' O7 l6 T3 x& P1 P: P
( N, R* y" h% O' f3 F0 x$ k + c. `5 X- A) g8 u2 u3 |" Q二浅:列表的操作 / s1 [# L) A" N0 R9 j首先介绍的是对列表的操作:包括列表的创建,列表的删除等!其中创建一个列表的方式有两种:7 i2 N8 g q! H4 q3 Q7 H
第一种方式: # F& f: ^! a) E4 b* Y/ ~+ r通过[]包裹列表中的元素,每个元素之间通过逗号,分割。元素类型不限并且同一列表中的每个元素的类型可以不相同,但是不建议这样做,因为如果每个元素的数据类型都不同的话则非常不方便对列表进行遍历解析。所以建议一个列表只存同一种类型的元素。 $ |5 h" C v( Q$ f & H/ @2 x9 @0 I' A: R2 a ; c9 [, j: M) [& t list=[element1, element2, element3, ..., elementn] $ ^2 `' C7 w& _& d" F5 G1 * }( b. j' {, o8 |2 n9 a例如:test_list = ['测试', 2, ['码农飞哥', '小伟'], (12, 23)] ( q" d2 S9 }8 dPS: 空列表的定义是list=[] 8 @$ E/ @2 Q' X; z. A4 H第二种方式: ! k# Z/ n8 B; Y2 q通过list(iterable)函数来创建列表,list函数是Python内置的函数。该函数传入的参数必须是可迭代的序列,比如字符串,列表,元组等等,如果iterable传入为空,则会创建一个空的列表。iterable不能只传一个数字。, R6 s7 A6 n, E; d- e$ w
- | G7 ?5 F9 D8 P! Z
" F2 h/ @, [$ [; q# C1 d1 B! ^
classmates1 = list('码农飞哥')% ^& a* t/ K- y8 r$ e) {
print(classmates1) 9 e. i9 U2 w+ T/ ^1 # F: B: w6 r7 w' r, Z8 E+ a2$ @1 k+ Y# [* e! J4 F4 t
生成的列表是:['码', '农', '飞', '哥'] ' O6 d: H7 p" v. `( m) v 8 T1 h. b+ N) G# h: _* {+ E6 L 3 n; F; o- j4 g$ \% P三浅:向列表中新增元素 7 l7 O5 ]3 `7 n; y) P向列表中新增元素的方法有四种,分别是: ; y9 x$ i$ ]: T第一种: 使用**+运算符将多个列表**连接起来。相当于在第一个列表的末尾添加上另一个列表。其语法格式是listname1+listname28 P! B4 h4 v: q$ n* p0 a) o
. L, N# c/ Q, Z9 F( Y; F: r! {
1 l' W4 O0 l; i2 g7 c' G
name_list = ['码农飞哥', '小伟', '小小伟'] w; l2 t- W2 V) ?4 U0 bname_list2 = ['python', 'java'] $ `4 c& }, i$ G7 cprint(name_list + name_list2) - Y" k V+ E% d* o3 o. s' F* T" i11 o+ e7 q, v% ^
2 . F) m) C: M* u! D- e3 ; J* \) G2 i o! @输出结果是:['码农飞哥', '小伟', '小小伟', 'python', 'java'],可以看出将name_list2中的每个元素都添加到了name_list的末尾。 $ C9 t0 ?$ N9 H& A' \5 ^1 f第二种:使用append()方法添加元素 & e) `8 g3 \* H2 H; I; Kappend()方法用于向列表末尾添加元素,其语法格式是:listname.append(p_object)其中listname表示要添加元素的列表,p_object表示要添加到列表末尾的元素,可以是字符串,数字,也可以是一个序列。举个栗子: " }& \9 o$ J" C+ X 3 f) e0 x6 C$ M3 t/ m5 v" D. ? : o7 @$ ]5 t7 y/ G4 I: qname_list.append('Adam')# v* b) x' g7 P+ q3 k. b* I% I) j
print(name_list); w+ F; H4 v; I3 i/ ?5 H. _0 K
name_list.append(['test', 'test1'])9 R) a' R5 E% T8 k& g0 \, F; \: ^
print(name_list) : U5 m% V$ i3 ~; b1 $ }8 y' T( p- B4 C' `, {% x2 4 k' U- ]. Y# m- J/ i8 J9 e3' L- z" H7 L Q S b
4 # h9 S2 c4 A* J- v* g" S$ j. S运行结果是: ( ?1 z4 X( G" m" v3 k# L. H# D 7 K$ z3 f1 i* t+ w I: ? ~, I+ _8 K) e7 b- N C
['码农飞哥', '小伟', '小小伟', 'Adam']! ?8 Y+ U6 q. q* j7 }
['码农飞哥', '小伟', '小小伟', 'Adam', ['test', 'test1']] % h5 X8 P3 [* l, w1 ( a# V2 e0 [$ c$ P: r2 1 v! e' V7 }6 w% o: o: f可以看出待添加的元素都成功的添加到了原列表的末尾处。并且当添加的元素是一个序列时,则会将该序列当成一个整体。 7 s7 n+ z5 t9 A第三种:使用extend()方法 + N7 A) }( ]0 I5 c2 f9 vextend()方法跟append()方法的用法相同,同样是向列表末尾添加元素。元素的类型只需要Python支持的数据类型即可。不过与append()方法不同的是,当添加的元素是序列时,extend()方法不会将列表当成一个整体,而是将每个元素添加到列表末尾。还是上面的那个例子: 8 g1 H1 a$ x: x4 O- @) B# ?$ e% F2 K $ }. f' Q" r& p/ s; n- ?8 G$ ]( v0 @
name_list = ['码农飞哥', '小伟', '小小伟'] 6 F" |" h" r! J& ^( d& vname_list.extend('Adam') % W q+ u" X& W: \+ Q, pprint(name_list); _, f8 M- G) T* L& M# ~
name_list.extend(['test', 'test1'])" e4 s8 W% W6 ^
print(name_list)9 B/ r1 e* _' y1 |; T: M
1 ( O7 |5 ?- K' [* l6 S" O$ }20 s/ X0 T9 ]& l/ A( R/ n
3 ( P' N/ z; a6 ?8 p! Z4" v# Q2 h, K: F# G4 Y
5 ~* u/ m' _' c t2 }2 @
运行结果是:* W/ f- U3 h! Q% t3 @( Y( s
b* y8 V Q2 y# k5 O* c$ T0 jtypedef struct { ( h0 l; a) k9 I5 x; c( } PyObject_VAR_HEAD' |5 l. a( [0 F/ ~! T
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ ! Y l1 P" m9 m/ c% D PyObject **ob_item;! k" ~2 C& O, g1 ?: W6 }' C
# u1 e+ C' s1 w. t3 B4 J V( ]0 o0 P" r$ p. x7 N$ \
/* ob_item contains space for 'allocated' elements. The number 1 u3 x4 T( u% ]2 i) x3 W2 G; Q * currently in use is ob_size. 3 L. H, b, {* U+ O6 Z * Invariants: % I# ~2 ]2 z6 V$ v( @2 R1 p * 0 <= ob_size <= allocated 6 D- ~) t8 ?7 Y/ C * len(list) == ob_size ; {0 E- ?3 S- F/ y * ob_item == NULL implies ob_size == allocated == 0- P% Z# j( Q1 _7 s
* list.sort() temporarily sets allocated to -1 to detect mutations.- ?6 `/ T) X+ @; {
*" Y- D9 X9 B- l% q# |
* Items must normally not be NULL, except during construction when 4 M% a% W: C1 T/ J; m * the list is not yet visible outside the function that builds it. & G8 O% R/ p, _$ p! Y/ [- g */ 8 Y- \; M; y' v' j1 ^; F. f Py_ssize_t allocated; / O0 t& M/ v1 b1 K& f} PyListObject; # T+ \# P& b- P1- ~: I: Z5 l( ?$ ^8 B
2" r. q4 M; I( {* X* j1 F
3 ; v- y* ]8 D0 m# p4 . Q! P. u" C P/ E! H5" E, F4 }+ X9 D+ y; s) S* Z) {
6 : y; y1 [8 o6 C, C' I/ X% v78 k5 x6 ?" h0 L
8 7 f" O) l; w8 D9/ S' n) [! C, i3 a
109 q; e# w4 `- I4 J) C% n
11( o% Y: N! s+ |# O4 y7 {
12, q. Y1 x! u- e6 L w: u/ V& `, Z* R
13 # ^/ V; s, |6 ~14 7 Q4 p K S5 k. [6 G15 # e% q, y$ K: J169 R9 g0 y3 v' f0 D9 b! f
175 {8 w; W: G7 E# Q
18. g8 L* L+ L3 n
PS:列表实现的源码文件是 listobject.h 和 listobject.c。$ X8 i" P) S' T4 A1 _; w( E
list 本质上是一个长度可变的连续数组。其中ob_item是一个指针列表,里面的每个指针都指向列表中的元素,而allocated则用于存储该列表目前被分配的空间大小。 5 s) r: {, _1 a3 O4 ]需要注意的是,allocated和列表的实际空间大小不同,列表实际空间大小是指len(list)返回的结果,即上面注释中的ob_size,表示该列表实际存储了多少个元素,而实际情况是,为了优化存储结构,避免每次增加元素都要重新分配内存,列表预分配的空间allocated往往大于ob_size。他们的关系是0 <= ob_size <= allocated。- U: E) Q# U. L8 P. H) U1 t
接下来在分析元组,如下所示为Python3.7 tuple元组的具体结构: 2 ^" J2 w" f o5 Z9 [$ H1 i& j1 W) y' K# g. c
: r; W* M2 k$ Y" _
typedef struct { d" O2 S' a; |4 x' D4 C" n$ { PyObject_VAR_HEAD; v# i. U: N) Y1 {/ L
PyObject *ob_item[1]; + E0 ~: \ l+ \; x* { & A, M9 W; n5 E , b* \+ ~* q% q+ B /* ob_item contains space for 'ob_size' elements." m- o) Q) e2 U- B+ [
* Items must normally not be NULL, except during construction when5 F, O V# y9 l9 R/ M
* the tuple is not yet visible outside the function that builds it. D- x. x7 Z. U6 c6 Z
*/) b/ H# k, h& X/ R9 v! Q8 K. f
} PyTupleObject;6 w. V5 O5 [5 U. [' ^" R$ c' G
1 ; c/ R) T& _0 @& X. z$ Y; J2 ) O3 e: Y3 s. M3 7 b) [6 C6 B- s1 h& a' ^% J4 : r _9 D' C# }9 _' E5' ]1 [1 C3 K B+ z4 @, J, z+ o9 A
60 M5 B4 j! b" O2 ^, x: I( R9 E
7 ) |6 E/ @: |9 n- g83 S6 C3 h" Z3 S& z
9 P! G$ E; ]- P" @" U% s/ cPS: 元组(tuple)实现的源码文件是 tupleobject.h 和 tupleobject.c。) }. {, z7 \: @" a
tuple和list相似,本质也是一个数组,但是空间大小固定。不同于一般数组,Python 的 tuple 做了许多优化,来提升在程序中的效率。 / s1 Z: O6 |) [3 z$ K, e8 M5 t+ l. n, v6 S% s! q% O" q
; V9 u7 D/ a" a- c2 G4 p9 j& e' Y
2 o0 \. U9 W( z3 y% E3 ^( w: n8 S8 y0 ^3 g$ g+ o
总结* F" P' l7 J5 L/ B: t
本文详细介绍了Python内置数据类型中的列表(list)和元组(tuple)。特别是列表,它的新增元素和删除元素的方法很多,各种方法之间还有许多不同,需要在使用时特别注意。对于不涉及修改元素操作的场景,优先使用元组。因为它的性能更好,所占空间更少。/ [8 v9 M" @. u; O. w
4 Y5 T0 u$ s( d( J
$ O0 ^$ M9 r/ p7 D8 {( W- O
为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下。0 t- R9 k7 V+ T) p
———————————————— ( Q* M; q4 I% Z7 a% ]% a: M版权声明:本文为CSDN博主「码农飞哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% S1 U) H, ~% W( ~4 P( Q5 l- u* T
原文链接:https://blog.csdn.net/u014534808/article/details/1181617033 a+ ]1 w0 x2 ], D! A& G