列表及相關操作的總結

2021-07-11 02:37:49 字數 3285 閱讀 7939

1、 如何來進行物件的拷貝

在進行物件拷貝的時候,一不小心就會變成了物件引用,在賦值的時候使用的是引用,而在其他的例如a=【】的時候是物件的繫結。

>>> list1

['kel', 2]

>>> list2 = list1

>>> list2

['kel', 2]

>>> list2[0]='changed list 2'

>>> print list1,list2

['changed list 2', 2] ['changed list 2', 2]

在將list1賦值給list2的時候,然後修改其中乙個值,那麼兩個都會發生改變,因為在這種情況,兩者都是引用,只是繫結了不同的變數,引用指向的是同乙個物件,在修改其中乙個物件的時候,實際上兩者都發生了改變,那麼在這種情況下,如果要獲得乙份拷貝,那麼可以用到copy模組。

copy模組中提供了兩個方法,乙個是copy方法實現的是淺拷貝,乙個是deepcopy方法實現的是深拷貝,具體描述如下:

物件的淺拷貝copy.copy:生成了新物件,但是物件內部的屬性和內容依然引用的是原物件,從而操作速度快,並且節省記憶體;

物件的深拷貝copy.deepcopy:在拷貝容器物件的時候,遞迴的拷貝其內部引用的物件-包括所有的元素,屬性,元素的元素和元素的屬性

>>> import copy

>>> list1 = [[1,2,'kel'],[1,2]]

>>> list2 = copy.copy(list1) #使用淺拷貝生成了乙個新的物件,但是裡面的物件依舊是原來物件的引用

>>> print list1,list2

[[1, 2, 'kel'], [1, 2]] [[1, 2, 'kel'], [1, 2]]

>>> list1[0][2] = 'changed'

>>> print list1,list2

[[1, 2, 'changed'], [1, 2]] [[1, 2, 'changed'], [1, 2]] #從而在修改其中乙個物件的時候,所有的都會發生改變

>>> list3 =copy.deepcopy(list1) #使用深拷貝進行拷貝所有的元素和屬性

>>> print list1,list3

[[1, 2, 'changed'], [1, 2]] [[1, 2, 'changed'], [1, 2]]

>>> list1[0][2]='kel'

>>> print list1,list3

[[1, 2, 'kel'], [1, 2]] [[1, 2, 'changed'], [1, 2]] #在使用深拷貝的時候,改變其中乙個物件的子元素,其他的物件不會發生改變

在進行普通的拷貝的時候,如果具有內建方法,那麼可以直接使用內建的屬性來進行拷貝。

列表:l=list(l),字典:dict = dict(t),集合:s = set(s) 在使用這種方法進行拷貝的時候,方便快捷並且比較簡潔。

在提供拷貝的功能的時候,可以使用兩種方式,一種是提供__copy__方法,一種是提供__getstate__方法和__setstate__方法,從而可以直接在類中使用拷貝功能。

2、is操作符

>>> list1,list2,list3

([[1, 2, 'kel'], [1, 2]], [[1, 2, 'kel'], [1, 2]], [[1, 2, 'changed'], [1, 2]])

>>> list1 is list2

false

>>> list1 is list3

false

從上面可以看到,list1和list2的內容是相同的,但是為false,而list2是由淺拷貝從而生成的新物件,從而引用是不同的,從而返回為false,而深拷貝也是生成了乙個新的物件。

3、 拷貝列表

也可以使用其他的方法來進行拷貝,例如在序列中可以使用切片和列表解析

l = l[:] #使用切片

[x for x in l] #使用列表解析

當時改變乙個列表,而不是新建乙個列表的時候,最好的方法是使用列表解析:

l[:] = [lambda x : x >5 ,for x in l]
在對原來的列表進行操作的時候,不需要重新進行繫結,只要在原來的列表中進行修改即可,從而使用的是原列表的切片方法。

當要對每個元素呼叫乙個函式的時候,最好是使用imap方法,從而和列表解析是差不多的,但是比列表解析更加清晰。

生成器表示式和列表解析的語法相同,不同的在於個乙個是圓括號,乙個是中括號。,在生成器中,每次僅獲取到乙個元素。

[x if x>0 else 0 for x in list if x >5]
在列表解析中,條件判斷放在前面,而迴圈放在後面,也可以在後面進行條件判斷,但是放前面可以獲得不同的值。

4、查詢列表中元素,如果存在返回

def get_list(li,i,v=none):

if -len(li) <= i 定義了乙個方法,如果列表的有效索引在列表接收的長度之內,那麼就會返回列表的值,如果不存在,那麼返回為none

結果如下:

[root@python 410]# python getitem.py

kelnone

從上面可以看到,3在列表索引有效範圍為-len(l)到len(l)之間,從而返回了list的值,而當不在這個範圍內的時候,返回為預設值none

5、迴圈訪問序列中的元素和索引

在很多時候,需要迴圈的索引,而在很多迭代中,並不是按照索引值來進行迴圈的,從而可以使用內建函式enumerate。

迴圈都是用for進行迴圈,從而沒有索引,如下:

for item in sequence:

process(item)

使用enumerate內建函式後,可以得到索引值:

>>> for index,item in enumerate([1,2,3,4]):

... print index,item

...

0 11 2

2 33 4

在for的主題中,索引和值可以同時訪問。

列表及相關操作的總結

1 如何來進行物件的拷貝 在進行物件拷貝的時候,一不小心就會變成了物件引用,在賦值的時候使用的是引用,而在其他的例如a 的時候是物件的繫結。list1 kel 2 list2 list1 list2 kel 2 list2 0 changed list 2 print list1,list2 cha...

列表及列表的相關操作

概念 有序的一組資料的組合list1 1,2,3,4 1.訪問 list 索引位置 如 list 0 訪問列表最左邊第乙個元素.list 1 訪問列表最右邊乙個元素.2.修改 list 0 2 修改左邊第乙個元素為2 3.分片 獲取多個連續的資料 list 開始位置 結束位置 list 開始位置 結...

python列表生成式及相關操作

乙個需求,員工的稅前工資儲存在乙個叫salty的列表中,現在需要把所有員工的稅後工資計算出來,並存放到乙個aftertaxsalty的列表中,假設稅率為10 1.正常的操作 salty 10000,9000,12000,14500,13000 aftertaxsalty list for one i...