1. 程式人生 > >2.1.4 切片

2.1.4 切片

eba att all pos mos 是把 mod sequence 對象

  切片也是Python序列的重要操作之一,在形式上,切片使用2個冒號分隔的3個數字來完成,第一個數字表示切片的開始位置(默認為0),第二個數字表示切片的截止(但不包含)位置(默認為列表長度),第三個數字表示切片的步長(默認為1),當步長省略時同事可以省略最後一個冒號。

  切片適用於列表、元組、字符串、range對象等類型,應用於列表時具有最為強大的功能。可以使用切片來截取列表中的任何部分返回得到一個新的列表,也可以通過切片來修改和刪除列表中的部分元素,甚至可以通過切片操作作為列表對象增加元素。

  練習篇:

    1 使用切片獲取列表中的部分元素

 1 #使用切片可以返回列表原有元素的一個“子集”。與使用下標訪問列表元素的方法不同,切片操作不會因為下標越界而拋出異常,而是簡單地在列表尾部截斷或者返回一個空列表,
代碼具有更強的健壯性。
2 3 >>> alIST = [3,4,5,6,7,9,11,13,15,17] 4 >>> 5 >>> 6 >>> alIST[::] #返回包含原列表中所有元素的新列表 7 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] 8 >>> 9 >>> alIST[::-1] #
返回包含原列表中所有元素的逆序列表 10 [17, 15, 13, 11, 9, 7, 6, 5, 4, 3] 11 >>> 12 >>> alIST[::2] #隔一個元素取一個元素,獲取偶數位置的元素 13 [3, 5, 7, 11, 15] 14 >>> 15 >>> alIST[1::2] #隔一個元素取一個元素,獲取奇數位置的元素 16
[4, 6, 9, 13, 17] 17 >>> 18 >>> alIST[3:6] #指定切片的開始位置和結束位置 19 [6, 7, 9] 20 >>> 21 >>> alIST[0:100] #切片的開始位置大於列表長度是,從列表尾部截斷 22 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] 23 >>> 24 >>> alIST[100:0] #切片的開始位置大於列表長度是,返回空列表 25 [] 26 >>> 27 >>> alIST[100] #拋出異常,不允許越界訪問 28 Traceback (most recent call last): 29 File "<pyshell#84>", line 1, in <module> 30 alIST[100] 31 IndexError: list index out of range 32 >>>

    2 使用切片對列表元素進行增、刪、改

  可以使用切片操作來快速實現很多目的,例如,原地修改列表內容,列表元素的增、刪、改以及元素替換等操作都可以通過切片來實現,並且不影響列表對象的內存地址。

  1  >>> a = [3,5,7]
  2 >>> 
  3 >>> a[len(a):]
  4 []
  5 >>> 
  6 >>> a[len(a):] = [9]                           #在列表尾部增加元素
  7 >>> a
  8 [3, 5, 7, 9]
  9 >>> 
 10 >>> a[:3] = [1,2,3]                            #替換列表元素
 11 >>> a
 12 [1, 2, 3, 9]
 13 >>> 
 14 >>> a[:3] = []                                 #刪除列表元素
 15 >>> a
 16 [9]
 17 >>> 
 18 >>> a = list(range(10))
 19 >>> 
 20 >>> a
 21 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 22 >>> 
 23 >>> 9 // 2
 24 4
 25 >>> a[::2] = [0] * (len(a) //2 )            #替換列表元素
 26 >>> a
 27 [0, 1, 0, 3, 0, 5, 0, 7, 0, 9]
 28 >>> 
 29 >>> a[3:3] = [4,5,6]                        #在列表指定位置插入元素
 30 >>> 
 31 >>> a
 32 [0, 1, 0, 4, 5, 6, 3, 0, 5, 0, 7, 0, 9]
 33 >>> 
 34 >>> 
 35 >>> len(a)
 36 13
 37 >>> 
 38 >>> a[20:30] = [3] * 2                     #這樣也可以在列表尾部追加元素,註意切片的範圍
 39 >>> 
 40 >>> a
 41 [0, 1, 0, 4, 5, 6, 3, 0, 5, 0, 7, 0, 9, 3, 3]
 42 >>> 
 43 
 44 
 45 #另外,可以結合使用del命令與切片結合來刪除列表中的部分元素。
 46 
 47 >>>a = [1,2,3,9,11]
 48 
 49 >>>del a[:3]
 50 
 51 >>>a
 52 [9,11]
 53 
 54 
 55 #切片返回的是列表元素的淺復制,與列表對象的直接賦值並不一樣
 56 
 57 >>> a = [3,5,7]
 58 >>> b = a                         #b與a指向同一個內存
 59 >>> b
 60 [3, 5, 7]
 61 >>> b[1] = 8
 62 >>> a
 63 [3, 8, 7]
 64 >>> 
 65 >>> a == b                        #兩個列表的值是相等的
 66 True
 67 >>> 
 68 >>>a is b                         #兩個列表是同一個對象
 69 True
 70 
 71 >>> id(a) == id(b)                #兩個列表的內存地址相等
 72 True
 73 >>> 
 74 >>> 
 75 >>> a = [3,5,7]
 76 >>> 
 77 >>> b = a[:]                    #切片,淺復制
 78 >>> 
 79 >>> a == b                      #兩個列表的值是相等的
 80 True
 81 >>> 
 82 >>> a is b                      #淺復制,不是同一個對象
 83 False
 84 >>> 
 85 >>> id(a) == id(b)              #兩個列表對象的地址不相等
 86 False
 87 >>> 
 88 >>> 
 89 >>> id(a[0]) == id(b[0])        #不要懷疑,相同值在內存中仍然只有一份
 90 True
 91 >>> 
 92 >>> b[1] = 8                    #修改列表b中的元素值不會影響列表a中的元素值
 93 >>> a
 94 [3, 5, 7]
 95 >>> 
 96 >>> b                           #b列表的元素值發生改變
 97 [3, 8, 7]
 98 >>> 
 99 >>> a == b
100 False
101 >>> 
102 >>> a is b
103 False
104 >>> 
105 
106 
107 
108 #順便再補充一點,雖然直接把一個列表變量賦值給另一個變量時兩個變量指向同一個內存地址,但是把一個列表分別賦值給2個變量時就不是這樣的情況了,例如:
109 
110 >>> x = [1,2,3]
111 >>> y = [1,2,3]
112 >>> id(x) == id(y)
113 False
114 >>> 
115 >>> y.append(4)            #改變列表y中的元素值並不會影響列表x中的元素值
116 >>> x
117 [1, 2, 3]
118 
119 >>> y
120 [1, 2, 3, 4]
121 >>> 
122 
123 
124 #當列表中包含其他可變序列是,情況變得更加復雜,例如:
125 
126 >>> x = [[1],[2],[3]]
127 >>> 
128 >>> y = x[:]
129 >>> 
130 >>> y
131 [[1], [2], [3]]
132 >>> 
133 >>> 
134 >>> y[0] = [4]               #直接修改y中下標為0的元素值,不影響x中的元素值
135 >>> y
136 [[4], [2], [3]]
137 >>> 
138 >>> x
139 [[1], [2], [3]]
140 >>> 
141 >>> y[0].append(5)     
142 >>> y
143 [[4, 5], [2], [3]]
144 >>> 
145 >>> x
146 [[1], [2], [3]]
147 >>> 
148 >>> y[1].append(5)           #通過列表對象的方法原地增加元素,影響x中的元素值
149 >>> y
150 [[4, 5], [2, 5], [3]]
151 >>> 
152 >>> x
153 [[1], [2, 5], [3]]
154 >>> 
155 
156 #上述這段代碼的理解上需要記住兩點:
157 #(1)Python采用的是基於值的內存管理模式;
158 #(2)Python變量中並不直接存放值,而是存放值的引用。Python的變量更像一個容器,盛的就是實際值的內存地址,也可能是另外一個容器的地址。
159 
160 
161 
162 #註意:使用切片修改列表元素值時,如果左側切片是連續的,那麽等號兩側的列表長度可以不一樣;如果左側切片不連續,則右側列表中元素個數必須與必須與左側相等;使用del命令
163 #和切片刪除列表中部分元素是,切片可以不連續。例如:
164 
165 >>> x = list(range(10))
166 >>> 
167 >>> x[::2] = [3,5]                                        #等號兩側不等長,拋出異常
168 Traceback (most recent call last):
169   File "<pyshell#234>", line 1, in <module>
170     x[::2] = [3,5]
171 ValueError: attempt to assign sequence of size 2 to extended slice of size 5
172 >>> 
173 >>> 
174 >>> x[::2] = [1,1,1,1,1]                                  #等號兩側等長,可以執行
175 >>> 
176 >>> x
177 [1, 1, 1, 3, 1, 5, 1, 7, 1, 9]
178 >>> 
179 >>> del x[::2]                                            #可以刪除列表中不連續的元素
180 >>> 
181 >>> x
182 [1, 3, 5, 7, 9]
183 >>>

    

  

  

  

2.1.4 切片