1 引用和对象
1.1> 创建变量的过程
内存创建对象 --> 创建变量 --> 变量引用到对象
因此: 变量只是到内存对象的一个引用
1.2> 对象组成
类型标识符 (标识对象类型)
引用计数 (是否回收对象)
1.3> 垃圾回收
如果对象没有变量引用 (引用计数为 0), 那么会被回收
1.4> 共享引用: 多个变量引用同一个对象
- a = 1
- b = a // a 和 b 指向的是内存中同一对象
- a = 3
- b = a
- a = 4 // 改变 a 的值, 不会影响 a 的值 (只是单纯的改变引用指向)
1.5> 共享引用和原处修改 // 主要关注的是可变对象共享引用, 需要引入拷贝 (深浅拷贝的 id 都不同)
* 场景 1*// list 只有一层
- l1 = [1,2,3]
- l2 = l1
- l2[0] = 2 // 此处 l1 和 l2 都会改变
* 解决方案 *
- l2 =l1[:] // 浅拷贝 copy.cpoy() 也可实现
- l2[0] = 2 // 此处修改 l2 不会影响 l1
* 场景 2*// list 有多层
- l1 = [1,2,[1,2]]
- l2 = l1[:]
- l2[2][0] = 2 // 此处 l2 即使拷贝 (浅拷贝),l1 也会被影响
* 解决方案 *
l2 = copy.deepcopy(l1)
1.6> 共享引用和相等
- // 先导: python 对象包含 3 个要素 id(身份标识) value(值) type(对象类型)
- // == 判断的是 value 值 is 判断的是 id 标识
- s1 = 1
- s2 = 1
- s1 is s2 ==> True
- s1 == s2 ==> True // 小范围整数 (-127~256),python 不会创建新的对象, 1 会被 a 和 b 复用
- s1 = 'spam'
- s2 = 'spam'
- s1 is s2 ==> True
- s1 == s2 ==> True // 字符串类似于小整数
- s1 = [1,2,3]
- s2 = [1,2,3]
- s1 == s2 ==> True
- s1 is s2 ==> False // 对于 list,tuple,dict,set 时, s1 is s2 均为 False
来源: http://www.bubuko.com/infodetail-2866739.html