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列表的深复制是直接新建一个内存空间将原列表的所有内容全部复制。不论哪一个发生改变都不会对另一个造成影响。
本人才疏学浅,如果以上内容存在思虑不周或有误之处还望不吝指点。