Python浅拷贝简析

直接上代码…

单层的表

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》裘宗燕 著

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页