1.python列表的賦值
賦值主要是設定了一個變量的引用,賦值主要方式是通過=,*。
a = [[]]*6 a[0].append(1) a[5].append(2) print(a)
顯示結果:[[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
a = [1,2,[3]]
b = a
b.append(4)
print(a,id(a))
print(b,id(b))
顯示結果:
[1, 2, [3], 4] 2382876458056
[1, 2, [3], 4] 2382876458056
顯而易見,不論對於哪一個賦值的變量進行修改,由於引用的內存地址不變,最終修改的內存空間也不會變,所以最終顯示結果如上圖所示(如果賦值的是數值類型對象,會新建內存空間,形同深復制)
2.python列表的淺復制
python列表的淺復制方式一般是copy()和列表切片。
import copy
a = [1,2,[3]]
b = copy.copy(a)
b.append(4)
b[2].append(4)
print(a,id(a))
print(b,id(b))
顯示結果:
[1, 2, [3, 4]] 1990656670856
[1, 2, [3, 4], 4] 1990656671112
a = [[1,3],{'a':'b'},4,{4}]
b = a[:]
b[0].append(5)
b[1]['c'] = 'd'
b[3].add(10)
b[2] = 6
print(a,id(a))
print(b,id(b))
顯示結果:
[[1, 3, 5], {'a': 'b', 'c': 'd'}, 4, {10, 4}] 2720397671496
[[1, 3, 5], {'a': 'b', 'c': 'd'}, 6, {10, 4}] 2720397671624
淺復制分析:python列表的淺復制對於列表中存在可變的可迭代對象如列表,集合,字典這樣的存在也是引用的原對象的地址空間,所以會一同改變(此處不討論不可變的可迭代對象的引用)。對於列表中存在的數值型數據淺復制會直接創建新的地址空間用以保存。
3.python列表的深賦值
python列表的深復制就我已知只有copy.deepcopy()一種了。
import copy
a = [1,2,[3]]
b = copy.deepcopy(a)
b.append(4)
b[2].append(4)
print(a,id(a))
print(b,id(b))
顯示結果:
[1, 2, [3]] 2286733180040
[1, 2, [3, 4], 4] 2286733180296
深復制分析:python列表的深復制是直接新建一個內存空間將原列表的所有內容全部復制。不論哪一個發生改變都不會對另一個造成影響。
本人才疏學淺,如果以上內容存在思慮不周或有誤之處還望不吝指點。