1. 程式人生 > >python基礎資料型別:深淺(copy)___007

python基礎資料型別:深淺(copy)___007

1、賦值運算(賦值是同一個記憶體地址)

(1)列表

例子:

li = [1,2,3]
li1 = li
li.append('barry')
print(li,id(li))  # [1, 2, 3, 'barry'] 4874824
print(li1,id(li1))  # [1, 2, 3, 'barry'] 4874824

(2)字典

例子:

dic1 = {
"name":"江河",
"age":18,
"heigh":180
}
dic2 = dic1
dic1.setdefault('address','北京')
print(dic1,id(dic1))  # {'name': '江河', 'age': 18, 'heigh': 180, 'address': '北京'} 30834192
print(dic2,id(dic2))  # {'name': '江河', 'age': 18, 'heigh': 180, 'address': '北京'} 30834192

如圖:

(3)字串

例子:

s = 'alex'
s1 = s
s = s.replace('a','A')
s1 = s.replace('e','E')
print(s,id(s))  # Alex 36902536
print(s1,id(s1)) # AlEx 36932888

2、深淺(copy)

(1)淺copy:對於淺copy來說,第一層建立的是新的記憶體地址,而從第二層開始,指向的是同一個記憶體地址,對於第二層以及

更深層次來說,保持一致性

例子:淺copy()和賦值不一樣

淺copy()列表、字典都一樣,以list列表為例

例子1:

li = [1,2,3]
li1 = li.copy()   # id記憶體地址不一樣,建立一個新的記憶體空間
li.append('新增')
print(li,id(li))  # [1, 2, 3, '新增'] 30302792
print(li1,id(li1))  # [1, 2, 3] 30302856

例子2:

巢狀(第二層記憶體地址一致)  :整體的記憶體地址不一樣,巢狀的記憶體地址一樣

li1 = [1,2,3,[33,44,55],4,5,6]
li2 = li1.copy()
li1.append(66)
print(li1,id(li1),li1[3],id(li1[3]))  # [1, 2, 3, [33, 44, 55], 4, 5, 6, 66] 4874888 [33, 44, 55] 4874824
print(li2,id(li2),li2[3],id(li2[3])) 
 # [1, 2, 3, [33, 44, 55], 4, 5, 6] 31132616 [33, 44, 55] 4874824

(2)深copy():對於深copy()來說,兩個是完全獨立,改變任意一個元素(無論多少層),另一個記憶體地址絕對不會改變

例子:

import copy
li1 = [1,2,3,[33,44,55],4,5,6]
li2 = copy.deepcopy(li1)
# 改變第一層
li1.append(15)
print(li1,id(li1),li1[3],id(li1[3]))  
# [1, 2, 3, [33, 44, 55], 4, 5, 6, 15] 35468808 [33, 44, 55] 35470024
print(li2,id(li2),li2[3],id(li2[3]))
# [1, 2, 3, [33, 44, 55], 4, 5, 6] 35613896 [33, 44, 55] 35613960

# 改變第二層
li1[3].append(66)
print(li1,id(li1),li1[3],id(li1[3]))
# [1, 2, 3, [33, 44, 55, 66], 4, 5, 6, 15] 35468808 [33, 44, 55, 66] 35470024
print(li2,id(li2),li2[3],id(li2[3]))
# [1, 2, 3, [33, 44, 55], 4, 5, 6] 35613896 [33, 44, 55] 35613960

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

enumerate(sequence,[start=0])

sequence---一個序列可迭代的物件,start----下標起始位置

例子

li = ['alex','taibai','wusir','egon']
for i in li:
    print(li.index(i),i)

for index ,i in enumerate(li,2):
    print(index,i)