在学习之前,先回顾一下两个基础内容
运算符 == 和 is 的区别
- == 用于判断对象的value是否相等
- is 用于判断对象的id是否相同
可变对象与不可变对象
1.不可变对象:原对象的值不能被改变。如果要改变值,内存必须开辟新的内存地址,用来存储新对象,也就是会产生两个对象,新对象被引用而原来的对象被回收.
不可变对象主要有:数值型(int,float),字符串(str),元组(tuple)
2.可变对象:该对象可以在其内存地址(id)不变的情况下修改值.
可变对象主要有:列表(list),字典(dict),集合(set)
进入正题:前面我们看到了单个变量赋值的一些情况,现在我们引入另一个变量.
一. 独立赋值——非共享引用
1.1 变量指向不可变对象


1.2 变量指向可变对象



小结
独立赋值的情况下,不管对象如何,变量资源都是非共享的.只不过当变量指向的对象是可变对象,内存会开辟两个空间地址分别存储.
二. 复制
2.1 源对象为不可变对象(非共享引用)

2.2 源对象为可变对象 (共享引用)


小结
- b = a 的本质其实是b复制了a对对象的指向.不管哪种数据类型,原来a指向哪个对象,b也会指向这个对象.
- 资源共不共享其区别在于对象自身即可变对象与不可变对象.
总结

问题
以列表为例,有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这时候你只能通过独立赋值,但是赋值得把原来的数据重新再写一遍,很麻烦,python为这种需求提供了copy模块,提供了两种主要的方法,一种是普通的copy,另一种是deepcopy。我们称前者是浅拷贝,后者为深拷贝。可以发现深浅拷贝其实都是为了解决可变对象的.
网友评论