1. 程式人生 > >python(6)——循環刪除list、深拷貝和淺拷貝

python(6)——循環刪除list、深拷貝和淺拷貝

改變 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、深拷貝和淺拷貝