python 对象引用,可变性和垃圾回收

a = [1,2,3,4]
b = a

每一个变量都有标识,类型和值.对象一旦建立,它的标识毫不会变;标识能够简单的理解为对象在内存中的地址.python

  • 别名 ab 是别名指向 [1,2,3,4],若是a增长新的内容,b也会增长.
  • 相等性 b == atrue.==运算符比较连个对象的值(对象中保存的数据)
  • 标识 b is atrue,由于他们都指向 [1,2,3,4] 这个列表,is比较对象的标识

元组相对不可变性数据结构

  • 元组保存对象的引用,跟python的集合set同样,若是引用的元素是可变的,即使元组自己不可变,元素依然可变.即:元组的不可变形其实指tuple数据结构的物理内容(即保存的引用)不可变,与引用对象无关

默认作浅层复制app

  • 浅层复制 : 1.复制了最外层容器,副本中的元素是源容器中元素的引用 2.他们的值相等,单二者指向不一样的对象. 3.副本共享内部对象的引用
  • 浅层复制函数

    • 若全部元素都是不可变的,不存在任何问题,并节省了内存.
    • 若是存在可变的元素,如list会致使意想不到的问题.
l1 = [3,[66,55,44],(7,8,9)]
l2 = list(l1)
l1.append(100)  # 因为只复制了外层容器,这里仅有l1内容发生变化
l1[1].remove(55) # l1[1] 是一个list可变的元素,全部以l2[1]的元素也发生变化
l2[1] +=[33,22]
l2[2] += (10,11) # l2[2]是tuple,不可变的元素全部只有l2[2]发生变化.

深层复制,副本不共享内部对象的引用code


函数的参数做为引用时对象

  • python中惟一支持的参数传递模式是共享传参 call by sharing
  • 共享传参:函数的各个形式参数得到实参中各个运用的副本,便是函数内部的形参是实参的别名
  • 影响:函数可能会修改做为参数传入的可变对象,但没法修改那些对象的标识

不要使用可变类型做为参数的默认值
可变参数做为默认值会致使:若是么有指定内容,会共用一个对象.因此一般使用Nono做为接收可变值得参数的默认值.内存


防护可变参数rem

  • 若是定义函数的接受可变参数,应该谨慎的考虑调用方是否指望修改传入的参数.

del和垃圾回收容器

  • 对象毫不会自行销毁;然而,没法获得对象时,可能会被当作垃圾处理.一个对象的引用数量为0的话会被销毁
相关文章
相关标签/搜索