想必很多人都使用過列表的切片,通過切片可以從列表中獲取一個或多個元素,但你真的了解切片?
一、一般玩法
>>> name = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> name[0:2] # 獲取 0 - 2 中間的元素,不包括索引為 2 的元素
['a', 'b']
>>> name[:2] # 從 0 開始切,可省略 0
['a', 'b']
>>> name[1:] # 同樣地,切到最后一個也可以省略最后的元素索引
['b', 'c', 'd', 'e', 'f', 'g', 'h']
二、列表步長
列表切片實際上還可以接收第三個參數:步長(默認情況為 1),來試試將其改為 2 會有說明變化?
>>> name[1:6:2] # 每隔 2 個元素才取出一個來
['b', 'd', 'f']
>>> name[::2] # 如果是從頭到尾切,還可以寫成這樣
['a', 'c', 'e', 'g']
>>> name[::-1] # 同樣地,步長還可以是負數,當步長為 -1 時,相當於復制一個反轉的列表
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
>>> name[::-2]
['h', 'f', 'd', 'b']
容易出錯的地方:
>>> name[7:2:-2] # 相當於從索引為 7 到 索引為 2 中,每隔 2 各元素取一個出來
['h', 'f', 'd']
>>> name[10:2:-2] # 對於超出索引的,默認是從最后一個元素開始取
['h', 'f', 'd']
>>> name[100:2:-2]
['h', 'f', 'd']
三、列表深淺拷貝
淺拷貝
>>> A = name[:]
>>> id(A)
2004289344072
深拷貝
>>> B = name
>>> id(B)
2004289245384
>>> id(name)
2004289245384
原理透析
Python 的變量就像一個 標簽,或者說是一個名字,它通過指針指向元素值,可以理解為下圖所示:
深拷貝指向原來的值,兩者 ID一致,淺拷貝是從原來的值上復制一個副本出來。
四、面試題
1、列表 l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
,那么 print(l[10:3:-2])
為多少?
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(l[10:3:-2])
[9, 7, 5]
2、輸出值
A = 'apple'
B = A
B = 'banana'
print(A)
A
為字符串,是不可變類型,因此 A
的值始終不變,為:'apple'
3、輸出值
A = ['apple']
B = A
B[0] = 'banana'
print(A)
=
是深拷貝,兩者 ID 也相同,修改 B 會影響 A,修改 A 會影響 B,所以結果為: ['banana']
4、輸出值
A = ['apple']
B = A[:]
B[0] = 'banana'
print(A)
[:]
是淺拷貝,只拷貝了第一層,修改不會有影響,所以結果為:['apple']