赋值与深浅拷贝
赋值场景一:
a = 1
b = a
a = 2
print('a==', a)
print('b==', b)
打印出结果:
a==2
b==1
解析:当a=1的时候,内存中开辟两个空间,一个空间存放数字1,一个空间存放数字1的物理地址0X52446C40,当b=a的时候,是将a的值赋予b,内存中会开辟另一个空间也是存放数字1的物理地址0X52446C40,这个时候a和b同时指向数字1,如下图一:

图一:
当a=2的时候,内存中又会开辟一个空间,存放数字2,而数字2的物理地址0X52446C60将会存放到数字a里面替换掉原来的0X52446C40,如下图二:

图二:
这个时候在打印出a和b就会发现它们是不一样的。
赋值场景二:
a = [[1, 2], 3, 4]
b = a
a[1] = 'stone'
a[0][0] = '12345'
print('a==', a)
print('b==', b)
打印出结果:
a==[[12345, 2], 'stone', 4]
b==[[12345, 2], 'stone', 4]
发现只改变了a,但是b也同时改变了,a和b打印的结果是相同的。
解析:当a赋值为[[1, 2], 3, 4],b = a的时候,内存中会如下分配,重点关注a和b存放的物理地址是一样的。看如下图三:

图三:
而当a[1] = 'stone',a[1]存放的物理地址由原来的0X52446c80变成了0X16d8a4f0a0,而当a[0][0] = '12345'的时候,a[0][0]存放的物理地址由原来的0X52446C40变成了0X16d8af1a,标红色的部分。这个时候a变化,b跟着变化,a和b是完全一样的。如下图四:

图四:
深度拷贝场景三:
a = [[1, 2], 3, 4]
b = a.copy()
a[1] = 'stone'
a[0][0] = '12345'
print('a==', a)
print('b==', b)
打印出结果:
a==[[12345, 2], stone, 4]
b==[[12345, 2], 3, 4]
解释:开始变得特别的奇怪了,怎么a[1]改变了,b[1]没有跟着改变,而a[0][0]改变了,而b[0][0]确又跟着改变了呢,这与场景二的有不同了,场景二是一变都变,这个是一部分跟着变,一部分又不变,我们还是来画图分析分析,见下图五:

图五:
这里大家发现和之前的场景二有什么不一样的地方的了,对了,就是a和b存放的物理地址不一样,接着我们执行a[1] = 'stone',发现a[1]存放的物理地址从0X52446c80变成了0X238ea10f0a0,而b[1]没有改变,接着再看,当执行a[0][0] = '12345'的时候,a[0][0]和b[0][0]都从原来的0X52446C40变成了0X238ea1da,初步总结一句,深浅拷贝,第一层改变各不相干,第一层往下的改变同时改变。见如下图六:

图六:
浙公网安备 33010602011771号