fi = [] for i in range(3): def foo(x):print(x + i) #因爲函數在這時尚未執行,在這裏的i,指向的仍是同一個IP地址,因此都是2. fi.appent(foo) for f in fi: f(2)
答案:4,4,4
a = [0, 1, 2, 3, 4] print(a[-6:6]) #[0, 1, 2, 3, 4] print(a[6:-6]) #[]
切片:咱們基本上都知道Python的序列對象都是能夠用索引號來引用的元素的,索引號能夠是正數由0開始從左向右,也能夠是負數由-1開始從右向左。python
一般一個切片操做要提供三個參數 [start_index: stop_index: step]
start_index是切片的起始位置
stop_index是切片的結束位置(不包括),顧頭不顧尾。
step能夠不提供,默認值是1,步長值不能爲0,否則會報錯ValueError。
當 step 是正數時,以list[start_index]元素位置開始, step作爲步長到list[stop_index]元素位置(不包括)爲止,從左向右截取,
start_index和stop_index不管是正數仍是負數索引仍是混用均可以,可是要保證 list[stop_index]元素的【邏輯】位置程序員
必須在list[start_index]元素的【邏輯】位置右邊,不然取不出元素。
ruby
當 step 是負數時,以list[start_index]元素位置開始, step作爲步長到list[stop_index]元素位置(不包括)爲止,從右向左截取,
start_index和stop_index不管是正數仍是負數索引仍是混用均可以,可是要保證 list[stop_index]元素的【邏輯】位置
必須在list[start_index]元素的【邏輯】位置左邊,不然取不出元素。
假設list的長度(元素個數)是length, start_index和stop_index在符合虛擬的邏輯位置關係時,
start_index和stop_index的絕對值是能夠大於length的。例如上面那道題。
app
Python中切片操做的實現機制
(注:Python中先後雙下劃線名字的方法(函數)叫特殊方法,也有稱魔術方法的,這是從ruby那裏借用的。
一般特殊方法都是應當由解釋器去調用的,對程序員的接口一般是看起來更簡潔的方式,如常見的 len(list)
實質是解釋器調用list.__len__()方法。)
實際上在Python中對list引用元素和形式優雅簡潔的切片操做都是由解釋器調用的list.__getitem__(x)特殊方法。
>>> help(list.__getitem__)
Help on method_descriptor:
__getitem__(...)
x.__getitem__(y) <==> x[y]
其中x能夠是個整數對象或切片對象。
alist[5] 和 alist.__getitem__(5) 是徹底等效的。
>>> alist[5]
5
>>> alist.__getitem__(5)
5
>>>
而切片操做是把切片對象做參數調用__getitem__(),
>>> help(slice)
Help on class slice in module builtins:
class slice(object)
| slice(stop)
| slice(start, stop[, step])
|
| Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).
見下面的例子。
>>> alist[1:7:2]
[1, 3, 5]
>>> slice_obj = slice(1,7,2)
>>> alist.__getitem__(slice_obj)
[1, 3, 5]
>>>
一些經常使用的切片操做
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 取前一部分
>>> alist[:5]
[0, 1, 2, 3, 4]
# 取後一部分
>>> alist[-5:]
[5, 6, 7, 8, 9]
# 取偶數位置元素
>>> alist[::2]
[0, 2, 4, 6, 8]
# 取奇數位置元素
>>> alist[1::2]
[1, 3, 5, 7, 9]
# 淺複製,等價於list.copy()更加面向對象的寫法
>>> blist = alist[:]
>>> blist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 返回一個逆序列表,推薦reversed(list)的寫法,更直觀易懂。
>>> alist[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 在某個位置插入多個元素
>>> alist[3:3] = ['a','b','c']
>>> alist
[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
# 在開始位置以前插入多個元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:0] = ['a','b','c']
>>> alist
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 替換多個元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0:3] = ['a','b','c']
>>> alist
['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
# 刪除切片
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del alist[3:6]
>>> alist
[0, 1, 2, 6, 7, 8, 9]函數