直接上代码…
单层的表
x = [1,3,6]
y = x
z = [1,3,6]
--out--
x [1, 3, 6]
y [1, 3, 6]
z [1, 3, 6]
x[1] = 10
--out--
x [1, 10, 6]
y [1, 10, 6]
z [1, 3, 6]
x.append(20)
--out--
x [1, 10, 6, 20]
y [1, 10, 6, 20]
z [1, 3, 6]
c = x.copy()
x.append(30)
x [1, 10, 6, 20, 30]
c [1, 10, 6, 20]
两层的表
a1 = [[i+j for i in range(3)] for j in range(3)]
--out--
a1 [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
## 浅拷贝
a2 = a1.copy()
a1[0][0]=5
--out--
#索引为0的这一层未独立出来
a1 [[5, 1, 2], [1, 2, 3], [2, 3, 4]]
a2 [[5, 1, 2], [1, 2, 3], [2, 3, 4]]
#NOTE python 默认只是做了第一层拷贝 因而当改变发生在这一层时 这一层就会独立出来
a1[1] = [5,6,7]
--out--
a1 [[5, 1, 2], [5, 6, 7], [2, 3, 4]]
a2 [[5, 1, 2], [1, 2, 3], [2, 3, 4]]
a1[1][0]=100
--out--
#索引为1的这一层已经独立出来了!!!!!!!!!!
a1 [[5, 1, 2], [100, 6, 7], [2, 3, 4]]
a2 [[5, 1, 2], [1, 2, 3], [2, 3, 4]]
a1[2][0]=100000
--out--
#索引为2的这一层未独立出来
a1 [[5, 1, 2], [100, 6, 7], [100000, 3, 4]]
a2 [[5, 1, 2], [1, 2, 3], [100000, 3, 4]]
Python和C在赋值上有着不同的语义,可以将Python的"赋值"理解为“赋引用”。在一些可变对象的“赋值”上,往往要留意上述这种“浅拷贝”,因而要深入多层进行拷贝(一直做到不变元素)。
参考文献
《程序员学Python》裘宗燕 著