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...