数学建模社区-数学中国

标题: Python 列表 extend()函数使用详解 [打印本页]

作者: 2744557306    时间: 2024-3-22 11:52
标题: Python 列表 extend()函数使用详解
extend函数使用详解' F7 Q6 V5 Q, p4 r4 f" [" y
1、可以接收的参数5 @. N) e0 \: W/ V
1.1、添加字符串! t/ T6 i; s4 n, @# c* y7 V" W
1.2、添加元组- U2 M. J; F: l+ A
1.3、添加字典
5 @: U/ q8 J3 y. Q1 u2、原理解析" L5 H" k! w8 y# ^7 B
3、extend() 和 append()、+ 的区别?
- T' X  r& A4 O5 U( k5 e4、特殊的添加方式5 \" W( g  Q% ?' P: n
extend() 可以在列表末尾「添加」另一个「序列」中的值。
0 t" z, P) U& w: p3 Q: z. }! E# z
语法, j7 R0 @2 a- w, K" v
4 U7 k7 P" B# r* q7 D# Y
list.extend( iterable )4 Z; k/ h# ^/ N7 K4 n5 S
; e( n. p1 [9 T/ u
参数, X3 y, Q1 C& w- o1 M

9 R/ Y1 j* ]7 a  Y3 l1 @iterable :需要添加的元素列表
8 s1 l- A4 M' U$ I" O+ I4 _( l2 i返回值
3 m' L3 O/ ]7 F* U! G5 h
7 P& b) r% ^7 W% c/ J没有返回值,只是修改原来的列表# M; g, g: ^/ ]* y
实例:向列表中添加另一个列表$ L: l7 B* N; o
: c: q. c2 R  X5 d& h1 R
list1 = [1, 2, 3]
5 T1 ^- S, w" s1 R' ulist2 = [4, 5, 6]
( h) a% ^- h: u1 Z' S  ?; s3 C  b0 P# G( R
list1.extend(list2)
/ ^+ L. y  R* e0 W; G# ^print(list1)% g; d- B! V" W; [/ E4 \4 ^* a
; n+ F- g9 O$ j
输出:
- z% W7 U. a" V. D  J5 \& h8 y) C* Q* g8 B* s
[1, 2, 3, 4, 5, 6]
8 Z- g! @: a+ ?! H# E" P" g7 l) T! x* S, L* M' y! B' f8 H
1 B; P$ W" ^" t1 ?7 u1 a2 l
1、可以接收的参数7 w) `+ D- `, P( \( u& H
extend() 接收的参数类型是「可迭代对象」,任何具有_iter_()或_getitem_()方法的对象都是可迭代对象,Python内了很多可迭代对象,常见的有 list,str,tuple,dict。
& S& t5 I8 l/ m; `+ f8 G/ J* Y3 o
# D: W6 u4 D' m- I( ^  |
* W4 z9 n; @: D4 ~' ?0 L+ F) d6 |1.1、添加字符串
- f0 j3 P6 e# }1 `8 ]extend() 可以添加「字符串」类型的数据,字符串的每一个「字符」,都被当做一个新「元素」。1 |( H9 Q: i; G# t+ N: E

, `" N3 ]) g+ olist1 = [1, 2, 3]$ ^5 k5 H% J' U
str1 = 'abc'
+ j& D% e5 _  w! D/ U
( z2 C" d8 t6 j9 p- D. p0 q9 d# V' a3 elist1.extend(str1)# W! y3 W7 |6 K! m! v- @
print(list1)" A% k8 u  D5 o# r

" ^+ a! K4 J1 x, d9 s6 a1 i输出:' O9 f( N! R& O

2 g. n4 m, B: W: a[1, 2, 3, 'a', 'b', 'c']
( W9 n/ d7 s3 B3 v3 m' N
/ ^, s3 r5 f2 }; t. I& C- W  }$ l7 }+ x1 {5 _
1.2、添加元组/ g5 [3 X$ ]- m3 R- s
extend() 可以添加「元组」类型的数据,和添加列表类似,每个「元素」都被当做一个新元素。
# W0 A9 Q  E1 \6 Z4 N6 j5 [8 S
/ G9 \0 L' G& e  s+ Plist1 = [1, 2, 3]
3 g* h8 O3 ~7 @4 D! Ftuple1 = (4, 5, 6)
4 u' f3 D2 R) Q+ \" R4 V, Z3 N# h6 S, ^$ V
list1.extend(tuple1)! z2 n  |! n2 F/ J7 L3 e# E! Y+ k
print(list1)
1 v: x7 @/ @: o0 S2 `  K! V) ]' s5 L. N9 o
输出:, m( D% k' H7 V9 N& c. a3 F

2 M/ L- ?, g- W# e7 s( o3 o[1, 2, 3, 4, 5, 6]9 ~, ~; d& ]% K# A

0 Q( t5 K; c9 u3 v
- I  O8 k+ F* s  `; O1.3、添加字典1 w: r8 ^+ {# ?' S% ^  \1 q
extend() 可以添加「字典」类型的数据,只添加键,每一个「键」都被当做一个新「元素」。+ B2 S  w- T8 o2 ]& S+ X" O

. t6 \- p( {2 r# j9 Zlist1 = [1, 2, 3]
( T7 C- K% l: p; R4 ]- d3 P( sdict1 = {'key1': 1, 'key2': 2}
  U3 J) u  t0 c4 N8 X8 R, L( X* S0 i. o8 u3 G
list1.extend(dict1)0 _0 r: q- [! ~' ]
print(list1)7 F  p4 V- v  {' k# @1 n
; i( S, u4 |/ ~# l/ h2 a2 g
输出:2 H6 S5 \( k" h" f# g2 _
0 ?. P3 e6 p- c7 w
[1, 2, 3, 'key1', 'key2']
# x  M5 H) L* j' c
4 }- a* e4 _( a. c9 O% @
4 g" H8 V8 Q; c& E7 H9 |2、原理解析
  A3 n. @$ Z, s3 R+ F7 Pextend() 只是将元素追加在列表「末尾」,本质上是 “修改” 而不是 “增加”,不会创建新的列表。
0 M8 l+ Y+ \, q" T# H7 p3 R. C' k0 w' u, u
6 b7 n- |8 T$ L! V& \
7 s* i3 t) O4 y. d( e
我们打印添加前、后的内存地址可以发现,「内存地址」没有变,还是原来的那个列表。
! t# T$ u+ N+ W$ ]" Q& I" D2 J- N9 S2 k! D3 e7 p& ^+ o& F1 J2 h8 o5 y
list1 = [1, 2, 3]
% |- o; j4 E" s1 C& x- D* nlist2 = [4, 5, 6]2 H) T) b4 x1 z) j" k* \# p/ X

9 r5 F2 Q3 z$ W; k2 B- T, |6 lprint(id(list1))9 D( [( i8 Q: G" k! u  A( a) e8 C
list1.extend(list2)
8 o' e. {$ t& T3 _* w$ X% i" Hprint(id(list1))
  t( c: W0 I# j
+ c' i3 s* }3 f9 q5 l输出:/ O9 b; I! p( v. e# C0 t0 D% M

1 i& b$ k/ L$ c' M/ s! I3 r19305665089289 R# M8 `  X" r3 E  B
1930566508928
/ W8 v6 b8 T8 J# v
# g% {" _0 P1 N7 x6 E2 c% Y) Hextend() 在添加其他类型时,会先转换成 list,再添加元素,类似下面这样:! f  ]" i  l( j4 P$ I& p. h; H2 V
- L+ |; b  R+ C& X- g! s
list1 = [1, 2, 3]
( ?; E- d. i! U# ?) D: W$ ~6 Ystr1 = 'abc'
0 J. P# }  w' x" F7 N( ?2 T/ X1 S
! M+ U( `3 M+ t' v0 L$ D0 }3 rlist2 = list(str1)
8 `2 b, K! M3 X" S0 Kprint(list2)' }& E3 ], I# k$ {; i! j2 m
list1.extend(list2)! O- f* @  l% O- N0 C& T, ?) W- [# _
print(list1)
) c4 C0 \8 ]# s. O3 t* e2 F. e( @* I. f3 D$ J' v
输出:
6 ^' l5 F9 i( c" t; y" ]' E3 R; R0 @; a
['a', 'b', 'c']
. u. Y. N5 n7 e. R6 r7 W7 p[1, 2, 3, 'a', 'b', 'c']1 x! \( o8 R5 H9 G9 H

, Z( `3 ?5 @: \* ~4 m+ E+ O' V6 S0 B- [) n  Z- n
3、extend() 和 append()、+ 的区别?
; H* X2 T/ W+ c. I5 y以添加列表为例
# j: q$ J1 K. E7 K4 |* @% `0 d/ m+ o$ g3 N* V8 x+ [
extend() 添加列表,是将列表中的「每个元素」都当做一个新元素,添加到原来的列表中+ j8 G2 h2 A1 [+ n; T, x4 D
! h) U; `' K( V& t* Q
list1 = [1, 2, 3]
( W1 v3 L$ F- }list2 = [4, 5, 6]
& l) x5 p1 \! q, @$ Q: S& O5 r
- p, l1 b# v* \7 h) B& B2 \list1.extend(list2)8 y; n! `5 F. [; b1 _
print(list1)) k  G* ^0 T% d' ~

' y( d# q8 {0 I  M5 B输出:2 a  F  P. `0 Z8 h- Z

7 S# |) M+ L& D7 j) P: G1 Y[1, 2, 3, 4, 5, 6]/ v$ U) n- v9 r$ \( T: y4 k: O
& T/ L: d0 }! Z
append() 添加列表,是将「>整个列表」当做一个新元素,添加到原来的列表中% D8 |  Y. h  s# [$ @* l

: n; Z9 X1 `: C4 I/ @3 u6 Q; u5 Hlist1 = [1, 2, 3]( |) c& @+ z9 f' o6 d/ D: O( ]
list2 = [4, 5, 6]
* R% r2 o. b  T/ `$ z+ t- g7 i8 V
list1.append(list2)
4 D% h8 w3 `3 [6 Hprint(list1)# U& P1 S' P( `8 ^$ A
7 R7 G& @7 J3 B( z4 L
输出:6 _7 U1 ]3 \0 [- h0 u+ `5 q

# h  P* P/ G/ `  E6 R& k[1, 2, 3, [4, 5, 6]]0 L; Z+ q6 s4 \1 Z# d( M+ k
+ V( u. v7 v0 X! w& N2 ~6 I
+ 会「拼接」元素,并创建一个新的列表存放,内存地址会改变/ {% O$ q) q* u0 S8 a# D( ?/ S6 X

1 ?- E1 A" E" u1 blist1 = [1, 2, 3]
) A" D; l+ e6 H; Y% C. {list2 = [4, 5, 6]
2 i8 N; {* _6 ]6 |/ K. t5 T5 Q4 A' p" ]
print(id(list1))
. S. B$ N2 S# j% J* Tprint(id(list2))
% s4 Q  Z" M& _print(id(list1 + list2)); N9 H( C# Q0 \: W' d- n( D

+ Y( [3 R& i2 m3 y+ g/ U输出:1 W, Q/ g2 W# o9 u8 A
. x3 y" N% m' ^1 C
2680876376448
& y; s4 S2 q6 y2680876376576
2 b. J, i2 b! H- [. q$ q26808785441289 W" k- ^, x1 w6 K: p) E

% ]5 v4 `7 z3 k; \2 j. v+= 的效果跟 extend() 一样,每个元素都被当做一个新元素,并且不会改变内存& \+ j( b. j: m& w/ n. L
6 G% \: D: U6 V) G
list1 = [1, 2, 3]
* D% l6 e% ~+ u- `* S( j$ nlist2 = [4, 5, 6]
3 y/ y7 h' l& `& Nprint(id(list1))
: L0 V# z1 a2 ]- ^( a/ a! plist1 += list28 G/ M( z3 M, m% F9 n: s
print(list1)
& k4 H: S5 r- B2 X0 B% Mprint(id(list1))
5 t# ]- h- j+ C
3 b" X7 c2 {( M5 X4 C: o/ h输出:
' V* K2 \' {, }* {% v. ~: H4 O& @' f, }6 Y. }
2150265921856
5 y/ C$ Y( {4 ?* L[1, 2, 3, 4, 5, 6]3 d& S2 u1 L9 G2 r" X. f
2150265921856  [! U+ t" o- u7 o9 r
6 a9 N& H) D8 d( s
. c- p3 X9 V# Y, z/ V
4、特殊的添加方式
$ X' B: s( C! F5 s. g: G2 c配合算术「运算符」添加列表
8 @) w  k# p1 ^3 A( i
) X, B. q" ?0 a, o2 |+ Plist1 = [1, 2, 3]6 M" z9 W/ }+ @4 O" o
list2 = [4, 5, 6], q4 k' n; b- o6 v% y4 C

3 S" u+ }8 C* @5 V% v! s: Q3 zlist1.extend(list2 * 2)
0 x& j8 T5 Z" r8 ~print(list1)' L' Z& F# y1 p8 b) Y, v/ ?( `
list1.extend(list1 + list2)
/ z1 U/ {0 n6 k( C7 r  s( }print(list1)
0 S! `+ N# z  ^" N9 o8 t/ Q0 t3 R/ r& [& H! |7 z& y
输出:
7 Q& H1 U) W' v) b6 m: c1 [" v2 l
* O, ~; V% y; E4 l& S[1, 2, 3, 4, 5, 6, 4, 5, 6]
. g% `3 ?8 ^) m" ~) Q! h, L, S- Y[1, 2, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6]3 G4 ]- z0 _) G9 ^. X0 ^3 o8 Z
1
4 W1 F+ J. Z" v- Y6 X8 W2
# g6 t+ f: l$ z( a( V「索引」取值添加列表
( S3 d: e+ I/ l8 `, H: W3 v1 X( L$ z: b, C* b
list1 = [1, 2, 3]/ p* s; u. E# @# |1 {
list2 = [4, 5, 6]4 J$ Q+ G4 E6 t4 v# s6 k2 `. Z
! V3 G/ X) j; ^0 O; s
list1.extend(list2[1:2])
5 r% ?2 E( C- q3 W- s; ~print(list1)* m- p- t* B& w
! g9 Z0 _( G. o+ \6 x
输出:% z- k9 m5 X) e  y

: v4 q  H- A; I  _& F6 q[1, 2, 3, 5]/ w9 \6 U0 V" n# ~4 ~+ u

$ E! }" c3 ~9 L/ v
. c) Y# L$ G, e0 a1 ?( t3 F+ y+ j7 B% g. a





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5