python(6)——循環刪除list、深拷貝和淺拷貝
阿新 • • 發佈:2018-09-10
改變 move 不能 指向 for 管理功能 字符 pan pre
列表的內存自動管理功能,在刪除列表中的元素時,python會自動對列表內存進行收縮,並移動列表中的元素以保證元素之間沒有間隙,所以使用
“循環+remove()方法”來刪除列表中元素時會出現元素錯位
#刪除list1中的奇數 ist1=[1,1,1,2,3,4,5] for i in list1: if i%2!=0: list1.remove(i) print(list1) #[1,2,4]
若要正確循環刪list中的元素,定義兩個相同的list。一個list用於循環,從另一個list中刪除
import copy list1=[1,1,1,2,3,4,5] list2=[1,1,1,2,3,4,5] for i in list2: if i%2!=0: list1.remove(i) print(list1) #[2,4]
淺拷貝
#list2=list1 相當於 list2=list1.copy(),都是淺拷貝 #list2和list1指向同一個內存地址,所以list1變了,list2也會變 ;同樣不能達到正確刪除list1中奇數的目的 list1=[1,1,1,2,3,4,5] list2=list1 #淺拷貝 相當於 list1.copy() print(id(list1)) #2270067237960 id()取內存地址 print(id(list2)) # 2270067237960 for i in list2: if i%2!=0: list1.remove(i) print(list1) #[1,2,4]
深拷貝
# list2=copy.deepcopy(list1) 深拷貝,list1和list2指向不同的內存地址 import copy #導入copy模塊 list1=[1,1,1,2,3,4,5] list2=copy.deepcopy(list1) #深拷貝 print(id(list1)) #2085723515720 id()取內存地址 print(id(list2)) #2085723513928 for i in list2: if i%2!=0: list1.remove(i) print(list1) #[2,4]
字符串的值是不能改變的,所以字符串和list情況不同
1 a=‘cat‘ #a中保存的是cat的內存地址 2 b = a #將a中保存的內存地址賦給b,a和b指向同一塊內存地址 3 a=‘dog‘ #字符串的值是不能改變的,所以重新對a賦值會在分配一塊內存給dog,a指向dog的內存地址 4 print(a) #dog 5 print(b) #ca
python(6)——循環刪除list、深拷貝和淺拷貝