接上昨天的话题,一个字典对象dict1的值赋给另一个字典对象dict2,若dict2的值发生改变,那么dict1的值也会随之改变,这与我们潜意识中的变量赋值有冲突,我觉得有必要总结一下python中对象赋值是怎么样一回事。
不可变对象的赋值
不可变对象包括字符串,元组,字符串,先看一个简单的例子:
简述一下过程:1、创建一个变量b,并赋值为10,再创建一个变量a,并把变量b的值赋给变量a;2、打印变量a和b的内存地址,发现其占用同一个内存地址;3、将20重新赋给变量a,然后打印b的值,发现b的值并没有随着a改变。为什么呢?其实可以这样理解:对于python来讲,变量的赋值其实是创建新变量的过程,变量a被重新赋值为20后,其实是内存为其新分配了一个地址,称为了一个全新的变量,而原来的那个变量a被python的垃圾处理机制所回收,我们重新打印a和b所占用的内存地址,发现确实如此:
也可以用下面的图进行解释:
因此,对python不可变对象的赋值根据理解总结如下:
1、python的不可变对象赋值也就是现在内存中创建存储这个值的地址空间,再用一个标识来代表它。
2、python不可变对象的传递其实就是引用的传递。
3、创建新值就是创建新的内存,也即创建新的对象。
可变对象的赋值
那么对象的赋值又有何不同,同样举一个简单的例子:
简述一下上述过程:1、创建一个列表list1;2、把list1值赋给list2;3、在list1中增添一个元素;4、打印list2的值,发现list2的值也随之发生了改变。
打印list1和list2的内存发现其占用同一个内存地址。
同样可以用如下的图进行解释:
因此对可变对象的赋值做如下总结:
1、可变对象的改变只是改变对象的内容,而不改变其占用的内存地址。
2、对象的赋值只是引用的传递,引用永远指向对象所在的内存地址。
网友评论