【python内存机制】引用和赋值

  • 2020 年 1 月 14 日
  • 筆記

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