python列表中的賦值與深淺拷貝
阿新 • • 發佈:2019-01-08
首先建立一個列表
a=[[1,2,3],4,5,6]
一、賦值
a=[[1,2,3],4,5,6]
b=a
a[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
a=[[1,2,3],4,5,6]
b=a
b[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
總結:賦值不管是對a列表改變還是對b列表改變,
只要改變其中一個,另一個也會跟著變,這是因為a
和b共用一塊記憶體,沒有建立新的記憶體,
他們是相同的,他們指向同一個記憶體區域。
二、淺拷貝 [:]or copy()
a=[[1,2,3],4,5,6]
b=a.copy()
b[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
a=[[1,2,3],4,5,6]
b=a.copy()
a[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
a=[[1,2,3],4,5,6]
b=a.copy()
b[1]='tom'
print(a)
print(b)
結果:
[[1, 2, 3], 4, 5, 6]
[[1, 2, 3], 'tom', 5, 6]
a=[[1,2,3],4,5,6]
b=a.copy()
a[1]='tom'
print(a)
print(b)
結果:
[[1, 2, 3], 'tom', 5, 6]
[[1, 2, 3], 4, 5, 6]
總結:從上面程式碼可以看出來淺拷貝是重新開闢一塊記憶體,拷貝第一層資料,不拷貝內部子元素
在本程式碼中,b列表重新開闢了一塊記憶體放元素【b【0】,4,5,6】,也就是第一層內容,
然後b【0】的位置指向了a【0】指向的記憶體位置
三、深拷貝 使用copy函式
重新開闢一塊記憶體,存放拷貝列表的所有內容。a集合與b集合互不影響
import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
a[1]='tom'
print(a)
print(b)
結果:
[[1, 2, 3], 'tom', 5, 6]
[[1, 2, 3], 4, 5, 6]
import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
b[1]='tom'
print(a)
print(b)
結果:
[[1, 2, 3], 4, 5, 6]
[[1, 2, 3], 'tom', 5, 6]
import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
b[0][1]='tom'
print(a)
print(b)
結果;
[[1, 2, 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
a[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 2, 3], 4, 5, 6]
copy函式也可以淺拷貝:
import copy
a=[[1,2,3],4,5,6]
b=copy.copy(a)
a[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]