python深淺拷貝

2021-10-08 06:43:15 字數 3654 閱讀 2789

位元組與字串的關係:8byte = 1kb,位元組是計算機內的最小單位,字串是能看到的最小單位

li1 = [11,22,33,44,55]  #迴圈刪除,每乙個元素

for i in range(leng(li1)) :

del li1[i]

print(i)

print(li1)

$列表分配索引超出範圍

0[22, 33, 44, 55]

1[22, 44, 55]

2[22, 44]

$indexerror: list assignment index out of range

分析原因:

第一次迴圈當i等於0時刪除索引為0的元素22,列表變為[22, 33, 44, 55]

第二次迴圈當i等於1時刪除索引為1的元素33,列表變為[22, 44, 55]

第三次迴圈當i等於2時刪除索引為2的元素55,列表變為[22, 44]

第四次迴圈當i等於3時刪除索引為3的元素不存在,報錯

列表可變每次刪除元素,列表都發生變化,導致出現上面問題

刪除列表方法:

1.採用倒序刪除法

li1 = [11,22,33,44,55]

for i in range(len(li1)-1,-1,-1) :

del li1[i]

print(li1)

2.使用深拷貝先定義範圍,再迴圈刪除

lis = [11,22,33,44,55]

import copy

for i in copy.deepcopy(lis) :

lis.remove(i)

print(lis)

習題:刪除列表奇數字(二種方法)

li1 = [11,22,33,44,55]

li1 = li1[1::2]

print(li1)

$[22, 44]

li1 = [11,22,33,44,55]

for i in range(len(li1)-1,-1,-2) :

del li1[i]

print(li1)

$[22, 44]

分析題:

lis = [11,22,33,44,55]

for i in lis :

lis.pop()

print(lis)

$[11,22]

$為什麼不會全部刪除

$第一次進入迴圈i等於11,刪除最後乙個元素55,列表變為[11,22,33,44]

$第二次進入迴圈i等於22,刪除最後乙個元素44,列表變為[11,22,33]

$第三次進入迴圈i等於33,刪除最後乙個元素33,列表變為[11,22]

$第四次進入迴圈列表元素改變,不會再次迴圈

這樣可以解決問題

for i in range(len(lis)) :

lis.pop()

print(lis)

#dict.fromkeys(seq[,value])

dict1 = dict.fromkeys('asdfasdf]')

$#易範錯誤

dic = dict.fromkeys([1,2,3],'春哥')

dic = dict.fromkeys([1,2,3],)

print(dic)

$

字典的刪除

#迴圈刪除字典中鍵中包含'k『的鍵值對(兩種方法)

dic1 =

li1 =

for key,value in dic1.items() :

if 'k' not in key :

print(li1)

#能過列表操作字典

dic1 =

li1 =

for key in dic1 :

if 'k' in key :

for i in li1 :

del dic1[i]

print(dic1)

print(bool(0),bool(''),bool(),bool(()),bool({}),bool(set()))

$false false false false false false

可變的資料型別,集合元素必須是不可變資料型別,無序,集合自動去重複

基本操作:

set1 = set()

set2 = set} 錯

print(set1) 列印無序

增set.add('')

set.update('')

刪set.pop 隨機刪除,有返回值

set.remove 按元素刪除,沒有元素報錯

set.clear() 清空列表

$set() 空集合,{}空字典

del set 整刪除,報錯

改不可變資料型別,無序不能改

for i in set:

print(i)

比較方法:

set1 = 

set2 =

#交集 &

set3 = set1 & set2

#並集(所有元素) | union(聯合)

set3 = set1 | set2

#反交集 ^ symmetric_difference

set3 = set1 ^ set2

#差集 第乙個集合獨有

set3 = set1 - set2

#子集和超集 < issubset issuperset

集合方法:

集合本身是可變資料型別,可以使用frozense()將集合凍住

l1 =  [1,2,3]

l2 = l1

print(l1,l2)

#淺拷貝copy

l1 = [1,2,3]

l2 = l1.copy()

print(l1,l2,l1 is l2)

print(l1,l2)

l1 = [1,2,[4,5,6],3]

l2 = l1.copy()

print(l1,l2,l1 is l2)

print(l1,l2)

print(l1,l2)

print(id(l1[2]),id(l2[2]))

#深拷貝copy

#import coyp

l1 = [1,2,3]

l2 = copy.deepcopy(l1)

enumerate() 函式用於將乙個可遍歷的資料物件(如列表、元組或字串)組合為乙個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。

enumerate(sequence,[start=0])

li = ['a','b','c','d']

for index,value in enumerate(li) :

print(index,value)

#數字列可以設定開頭列

for index,value in enumerate(li,100) :

print(index,value)

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....