数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-22 11:52
标题: Python 列表 extend()函数使用详解
extend函数使用详解
% c1 M1 ~1 A: Q6 M. w# a% q7 y1、可以接收的参数
+ j1 a/ t3 E6 s3 Q( b+ s! K1.1、添加字符串. ]( ~: o& h% ^! E
1.2、添加元组! N' t  P& U, f, O
1.3、添加字典) J! X/ G  I2 E# `' T' r+ H
2、原理解析) }2 @, q( L: b* W
3、extend() 和 append()、+ 的区别?) ~: S5 K8 _* Z3 Y+ T2 w. s8 a
4、特殊的添加方式/ }$ J( [# F5 L- w
extend() 可以在列表末尾「添加」另一个「序列」中的值。( f8 y% m0 U' T% W" @, y: c6 U

7 ^! I$ }6 a/ Z1 C% {$ H. M语法. j5 e# r0 |% O0 s( w8 E

1 `7 ^- t( @$ `$ h) A. nlist.extend( iterable )
  u+ t7 {: Q) H  L) w. w2 |' m, q+ J' k' D/ ^5 X8 u
参数
7 D& t7 R/ T6 e
* Y2 J. Z- G( P7 {4 \: Giterable :需要添加的元素列表' D# E* z  q. a
返回值
% A( u4 j4 e- n. c9 C0 ], ]/ H( Y4 l
没有返回值,只是修改原来的列表
0 B! Q6 W' d/ S& v& Q: o& j实例:向列表中添加另一个列表
7 w+ S$ ]8 s; _; i+ z- f1 l* x2 Z0 c. Q
list1 = [1, 2, 3]
" n7 d9 [+ A1 C4 U) {list2 = [4, 5, 6]& Z( d" d2 F' O. j8 b/ g( }

, O: S( x% G7 D/ Glist1.extend(list2)6 z$ d* F/ \- ?3 W. R+ j# p3 P" i
print(list1)/ t* V5 q. y0 K
# }: D& a+ Y+ n. w2 m
输出:
. K+ f7 W; {2 Z" X: U# M7 n1 x
% X- t& E3 U& @[1, 2, 3, 4, 5, 6]
# S5 ~% x* O! Y) j4 \: M! F& _) X  z* _8 ~
& A" M% R# j/ S. }6 P5 j- o3 {
1、可以接收的参数! M% d( I# o: g2 b1 L5 N
extend() 接收的参数类型是「可迭代对象」,任何具有_iter_()或_getitem_()方法的对象都是可迭代对象,Python内了很多可迭代对象,常见的有 list,str,tuple,dict。1 x' |7 T; A7 k  e

2 S9 I% z1 S/ J  h$ t7 y# \& @* [
/ W3 T0 k! Q# n8 i+ M1.1、添加字符串
0 ^7 K2 m; Y+ y1 |extend() 可以添加「字符串」类型的数据,字符串的每一个「字符」,都被当做一个新「元素」。
; G7 ^) t+ N* {7 h+ T# j+ J+ B
: F6 u9 r) E& c, _# Dlist1 = [1, 2, 3]7 V( a' o! @) u, z7 u# a
str1 = 'abc'
$ h' [! P3 W- o- v6 R
6 _' X9 R- i$ n+ Z1 {* z1 z% n& r- ulist1.extend(str1)2 v4 P# k. J& O
print(list1): ^+ Y* U  R. u' S

' `/ Q. r  u' y输出:# Q" E* I; m, I
+ w4 T0 ?. |8 v9 B! R( |* f& `
[1, 2, 3, 'a', 'b', 'c']1 C2 l& K) s# W* S% e2 Z! ^9 j
4 k& [% p. e; z$ b2 Q
% f0 J# U+ C4 N0 n/ v+ h% g
1.2、添加元组% \5 {9 S9 s# o! a, j" Y% x$ f' q8 Y+ F
extend() 可以添加「元组」类型的数据,和添加列表类似,每个「元素」都被当做一个新元素。
( T5 W3 X5 Z- F4 e* @4 @( y( }, p8 C1 i. X+ {
list1 = [1, 2, 3]2 g& p, o6 Y$ C. a) H. b$ {
tuple1 = (4, 5, 6)
: A+ ~8 K) I9 p8 y0 M8 y
0 a* u8 ?" }+ z* N5 \list1.extend(tuple1)' ~" K8 ~' J2 a& L$ ^) I
print(list1). T) s* G  Z% l# _$ o/ i
) f1 [1 g) \* N7 {; o, S# l9 ?
输出:
  x' G, Z" O8 a
6 f! g: i% G; g8 D[1, 2, 3, 4, 5, 6]5 ?, C: C% N" g2 W3 |
) I" H+ i' D2 @0 x  j) L0 a) R
3 R8 |) y+ X' i, @& o) ?
1.3、添加字典
! l, U% `7 q2 p$ _' f0 Pextend() 可以添加「字典」类型的数据,只添加键,每一个「键」都被当做一个新「元素」。; \7 b  l  _* o

7 F0 D( b$ C9 d; A" Zlist1 = [1, 2, 3]- k1 g- p; o* \2 H% C& O
dict1 = {'key1': 1, 'key2': 2}
+ [8 j2 ]2 `: L) n) }( E" i" [: m( ?1 v0 R* M* X5 l0 S. ^
list1.extend(dict1)
; u, `4 W2 P. vprint(list1)
$ n7 ^4 @' u& O; g7 d
3 ^/ w/ L$ \: k, O- ?5 ?输出:
' T! B! Q$ t5 i/ h3 W0 I
# l& e9 B( z" Q! j[1, 2, 3, 'key1', 'key2']  \4 ~3 P" R& Z0 v3 u
" x& `: k1 B6 N: ~# L. N, A

( |$ D- b1 Q& T8 C0 V9 N2、原理解析" ?0 }: B% O3 s2 H$ V+ D
extend() 只是将元素追加在列表「末尾」,本质上是 “修改” 而不是 “增加”,不会创建新的列表。) D1 k9 h: s3 z; x  @9 {

, c: J$ f+ U1 w7 `( s6 I) N- y( n
- S$ o2 q5 R; Z* B5 b# n6 I
我们打印添加前、后的内存地址可以发现,「内存地址」没有变,还是原来的那个列表。  z. s  c4 [2 w3 ?2 R
6 L9 a2 |7 G- u' S+ [$ H2 h
list1 = [1, 2, 3]2 C, U, N  E0 Y2 V4 n, D, u
list2 = [4, 5, 6]
0 p* t$ G8 O5 w" g0 M! \
. y2 }$ V3 [( L0 ?5 [5 n* uprint(id(list1))
0 T8 J: s( J* O4 u1 ^9 S  K7 rlist1.extend(list2)% `. @, B+ Q* e- ~  H7 H7 [
print(id(list1))
! F' `, l% ~' q1 w) X' h. p; F' V6 J2 g+ w! k9 n5 o; B* c
输出:
6 |- z2 ?9 S7 w* B3 }4 s5 ?2 V% p& q" D
1930566508928
+ R6 O8 ]2 y8 j; @1930566508928
6 u0 S3 y6 [1 L
3 e  t* W2 ]3 ~- wextend() 在添加其他类型时,会先转换成 list,再添加元素,类似下面这样:4 g( U& G: D5 B, m3 S. H! k/ Z

2 a! ?( K$ T, c+ }$ D- F4 Plist1 = [1, 2, 3]1 t( v; O$ h9 {0 L
str1 = 'abc'4 g, `5 R3 R5 F8 a+ ?) @

; _% m+ ~$ {5 h8 k- F6 d% o: vlist2 = list(str1)
" b- L2 i6 |. F; Xprint(list2)
; w) r0 U" M8 t/ w9 i8 Qlist1.extend(list2)% W9 {$ s5 R$ ]  b/ A% a$ I% [
print(list1)
- e; x9 ?. X7 }$ }5 b2 w4 q  w# _% E4 b" V2 t# |* E: k5 D
输出:
9 C+ V' f+ V$ o0 ]5 k# h" q* W$ r2 `; m& z# L% c$ g/ g0 D
['a', 'b', 'c']. d) ], T. P9 v7 e" w8 s& y
[1, 2, 3, 'a', 'b', 'c']
8 R. h/ [) r5 P# v  w3 `" [; P0 {8 `. A; ?  {3 ]

7 D* O' K9 S) V3、extend() 和 append()、+ 的区别?
) F3 ?! q- I' i6 i) b; y以添加列表为例# V' _" }, P* I  |1 ^) o
+ ^# t# j- a3 m# }
extend() 添加列表,是将列表中的「每个元素」都当做一个新元素,添加到原来的列表中  U* G# N; r) d3 y9 q' o8 |6 c' E

" T: v) A1 j0 }' y8 X. t- Slist1 = [1, 2, 3]; X0 `; X0 V2 F3 F5 ?; c
list2 = [4, 5, 6]- Z3 E8 |+ F3 Y" e+ h
! u5 q  X. M7 N: S, G0 W% @" a# K: m6 y
list1.extend(list2)
. u/ s. ^# {* n- e/ Xprint(list1)
2 {7 [9 t" \9 r- e+ ?) O3 ^% ]9 Z2 R+ o0 ?) R+ T2 S
输出:
6 J; Z1 p6 T  b) K2 H! f  P1 M; @) v2 ~" Y
[1, 2, 3, 4, 5, 6]
% ]" I' ^/ O! ], t; z# x7 F2 T" o$ ?" E; D# ^
append() 添加列表,是将「>整个列表」当做一个新元素,添加到原来的列表中
  l& O% q5 a; U9 u. B$ Q7 r- W6 W
5 P# `8 r$ C' H& plist1 = [1, 2, 3]
% n1 t2 J0 U( olist2 = [4, 5, 6]
6 K+ y, d; y! j& k" E& o, |9 J# ~3 n2 F9 \+ V+ p+ [& r
list1.append(list2)* b2 X" Q- Q. {6 h2 F
print(list1)6 G- E# C$ }+ B& |! R

. W! }3 |- a8 x2 v+ g" l: }" O输出:1 L0 ^( ?5 e2 g3 c( w  X
/ _' V" S6 @2 r9 E
[1, 2, 3, [4, 5, 6]]
$ `/ V  }; H  S8 D# |* J+ l+ s/ b, f% P( i% C2 L7 l9 `8 P( [
+ 会「拼接」元素,并创建一个新的列表存放,内存地址会改变& A/ e9 K4 r$ S" A
8 B8 ^% P/ k6 ]/ J2 G* B0 [/ i
list1 = [1, 2, 3]
# n8 p1 G. m" q+ R2 b' h6 dlist2 = [4, 5, 6]7 j* R  h$ F6 r+ X

% t1 n0 U6 B; H6 q8 lprint(id(list1))& Z! R( C0 V( C6 J" t
print(id(list2))
- p! [/ w0 ~+ `+ z" }) }print(id(list1 + list2)). K* a# M1 s; z0 ~' {+ X/ i

6 x( z6 s* _! p2 ^输出:* F& W7 [1 C$ _! q  w# y) g

5 d* S, I+ W5 B  W& w5 c+ C2680876376448
4 v. g# w: w  j7 I3 y% c2680876376576
/ \! |9 k; S% b2680878544128: \! G4 C6 G3 ~9 ]! @

) q3 v  a6 X+ H+= 的效果跟 extend() 一样,每个元素都被当做一个新元素,并且不会改变内存
& O' p# [1 R4 ?! B% y8 w, [) _7 r, `7 Q7 L
list1 = [1, 2, 3]
* e2 a0 k) @/ Slist2 = [4, 5, 6]. R$ }- w/ T$ j$ r" K/ @* d$ h
print(id(list1))
, ?* l3 L# h0 V0 A3 m1 J# x2 slist1 += list2% j7 ]- f: Z4 l0 r  x+ P- y$ D4 V
print(list1)( R) e: @* J7 ^9 g6 {: W5 B' t
print(id(list1))
* z! s9 x& O2 O" v5 U+ U2 Y4 ~/ L( m( ~
输出:$ {1 ]  T) z/ _/ ~1 {' n& E- J

6 t9 l$ i# [* A' M' D2150265921856
; R; r- Q/ N/ n( ]6 G[1, 2, 3, 4, 5, 6]
% H, B' P. J( d21502659218569 _# G1 H8 i/ \1 d- }/ s, T3 K/ Y
  y6 a1 n. E2 m$ {. \, h
8 V& M9 ?+ F, t' l
4、特殊的添加方式( [2 I* T: e8 }
配合算术「运算符」添加列表
6 a8 T9 K) b  I1 U/ D8 b' f
% a7 E& s! J# w) i. {* O! n. Qlist1 = [1, 2, 3]+ b! y( O; g& t% A* y% N" T
list2 = [4, 5, 6]7 O  d2 l  ?0 i3 T: G

  o( G, T" z0 y3 W. flist1.extend(list2 * 2)
( x( O' k" a& s9 `print(list1)
% r+ `, D+ H. w1 t) ]3 Q2 nlist1.extend(list1 + list2)$ U& e: u7 t2 f( ^/ [) \6 r
print(list1)
5 ?) J7 t- g. H( I/ V0 V
: V5 ~8 _$ x4 [7 E; N: \2 q输出:$ U6 s  [' z4 |% @9 A" r' B! C1 k
( N5 \' x3 i: |$ @9 |, h
[1, 2, 3, 4, 5, 6, 4, 5, 6]+ B" g/ f8 G& v/ t/ d* ?% z
[1, 2, 3, 4, 5, 6, 4, 5, 6, 1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6]
/ o& u8 ~1 W& ^+ D7 f/ Z8 T1, T! K/ }- j. T9 ~6 p
2
! j  y! {4 W" h8 O+ @% [「索引」取值添加列表4 O3 J4 E8 ~. P

7 ~% N( o, f$ o  z- u) llist1 = [1, 2, 3]& X# @/ K" o" i+ }; [+ j
list2 = [4, 5, 6]
/ w2 |$ B( V7 I4 |  ]" N* k
4 h2 M# q5 p/ x1 Nlist1.extend(list2[1:2])4 s& I% r, M; n2 w6 t* H+ p
print(list1), [8 _2 z3 b3 {0 l# I

4 k5 u; j0 W5 f5 [% I' Z! ^输出:% S1 \( _2 b6 S( S
8 M- {1 Y4 J) B3 Q! e7 O
[1, 2, 3, 5]# I! U& j! N$ w4 F, s& E8 R

) {1 c" \- a# I% A$ `, x+ T0 w% w* t  }: R9 h8 s3 S: r! A8 t& l1 t5 [
" n4 i( |7 H  m





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