赋值与深浅拷贝

 

赋值场景一:

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,初步总结一句,深浅拷贝,第一层改变各不相干,第一层往下的改变同时改变。见如下图六:

图六:

 

posted on 2018-07-27 16:16  stone_wei  阅读(88)  评论(0)    收藏  举报