python对象的赋值

        接上昨天的话题,一个字典对象dict1的值赋给另一个字典对象dict2,若dict2的值发生改变,那么dict1的值也会随之改变,这与我们潜意识中的变量赋值有冲突,我觉得有必要总结一下python中对象赋值是怎么样一回事。

不可变对象的赋值

      不可变对象包括字符串,元组,字符串,先看一个简单的例子:

python对象的赋值

       简述一下过程:1、创建一个变量b,并赋值为10,再创建一个变量a,并把变量b的值赋给变量a;2、打印变量a和b的内存地址,发现其占用同一个内存地址;3、将20重新赋给变量a,然后打印b的值,发现b的值并没有随着a改变。为什么呢?其实可以这样理解:对于python来讲,变量的赋值其实是创建新变量的过程,变量a被重新赋值为20后,其实是内存为其新分配了一个地址,称为了一个全新的变量,而原来的那个变量a被python的垃圾处理机制所回收,我们重新打印a和b所占用的内存地址,发现确实如此:

python对象的赋值

     也可以用下面的图进行解释:

python对象的赋值
python对象的赋值


    因此,对python不可变对象的赋值根据理解总结如下:

    1、python的不可变对象赋值也就是现在内存中创建存储这个值的地址空间,再用一个标识来代表它。

    2、python不可变对象的传递其实就是引用的传递。

    3、创建新值就是创建新的内存,也即创建新的对象。

可变对象的赋值

      那么对象的赋值又有何不同,同样举一个简单的例子:

python对象的赋值

     简述一下上述过程:1、创建一个列表list1;2、把list1值赋给list2;3、在list1中增添一个元素;4、打印list2的值,发现list2的值也随之发生了改变。

      打印list1和list2的内存发现其占用同一个内存地址。

python对象的赋值

    同样可以用如下的图进行解释:

python对象的赋值
python对象的赋值

    因此对可变对象的赋值做如下总结:

    1、可变对象的改变只是改变对象的内容,而不改变其占用的内存地址。

    2、对象的赋值只是引用的传递,引用永远指向对象所在的内存地址。

   

;