资讯专栏INFORMATION COLUMN

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

Flands / 1016人阅读

摘要:每个变量都有标识类型和值对象一旦创建它的标识绝不会变标识可以简单的理解为对象在内存中的地址别名跟是别名指向如果增加新的内容也会增加相等性为运算符比较连个对象的值对象中保存的数据标识为因为他们都指向这个列表比较对象的标识元组相对不可变性元组保

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

每个变量都有标识,类型和值.对象一旦创建,它的标识绝不会变;标识可以简单的理解为对象在内存中的地址.

别名 ab 是别名指向 [1,2,3,4],如果a增加新的内容,b也会增加.

相等性 b == atrue.==运算符比较连个对象的值(对象中保存的数据)

标识 b is atrue,因为他们都指向 [1,2,3,4] 这个列表,is比较对象的标识


元组相对不可变性

元组保存对象的引用,跟python的集合set一样,如果引用的元素是可变的,即便元组本身不可变,元素依然可变.即:元组的不可变形其实指tuple数据结构的物理内容(即保存的引用)不可变,与引用对象无关


默认做浅层复制

浅层复制 : 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]发生变化.

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


函数的参数作为引用时

python中唯一支持的参数传递模式是共享传参 call by sharing

共享传参:函数的各个形式参数获得实参中各个运用的副本,即是函数内部的形参是实参的别名

影响:函数可能会修改作为参数传入的可变对象,但无法修改那些对象的标识


不要使用可变类型作为参数的默认值
可变参数作为默认值会导致:如果么有指定内容,会共用一个对象.所以通常使用Nono作为接收可变值得参数的默认值.


防御可变参数

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


del和垃圾回收

对象绝不会自行销毁;然而,无法得到对象时,可能会被当做垃圾处理.一个对象的引用数量为0的话会被销毁

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42372.html

相关文章

  • Python中的对象引用变性垃圾回收

    摘要:一对象引用基础知识变量是标注而不是容器。也就是说元组中不可变的是元素的标识,但元组的值会随着引用的可变对象变化而变化。在中每个对象的引用都会有统计。弱引用不会妨碍对象被当做垃圾回收。 导语:本文章记录了本人在学习Python基础之面向对象篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、明确变量保存的是引用这一本质;2、熟悉对象引用的基础知识;...

    ytwman 评论0 收藏0
  • Python学习之路27-对象引用变性垃圾回收

    摘要:函数的参数作为引用时唯一支持的参数传递模式是共享传参,它指函数的形参获得实参中各个引用的副本,即形参是实参的别名。而在上面这个例子中,类的属性实际上是形参所指向的对象所指对象,的别名。 《流畅的Python》笔记本篇是面向对象惯用方法的第一篇,一共六篇。本篇主要是一些概念性的讨论,内容有:Python中的变量,对象标识,值,别名,元组的某些特性,深浅复制,引用,函数参数,垃圾回收,de...

    Batkid 评论0 收藏0
  • 流畅的python读书笔记-第八章-对象引用变性垃圾回收

    摘要:运算符比较两个对象的标识函数返回对象标识的整数表示。实际上,每个对象都会统计有多少引用指向自己。对象被销毁了,调用了回调,的值变成了。当对象的引用数量归零后,垃圾回收程序会把对象销毁。引用的目标对象称为所指对象。 对象不是个盒子 showImg(https://segmentfault.com/img/bV95mW?w=1784&h=988); class Gizmo: def...

    zgbgx 评论0 收藏0
  • python对象引用变性垃圾回收

    摘要:对象引用和可变性变量不是盒子,而是便利贴变量的赋值方式比如是将一个变量分配给一个对象比如整数。运算符比较两个对象的标识函数返回对象标识的整数表示。每个对象都会统计有多少引用指向自己。对象被销毁执行回调函数输出 对象引用和可变性 变量不是盒子,而是‘便利贴’ >>> a = [1,2,3] >>> b = a >>> a.append(5) >>> a [1, 2, 3, 5] >>> ...

    chavesgu 评论0 收藏0
  • 万物之基础——对象

    摘要:每个对象均有标识符类型值。通常我们认为当这些对象被垃圾回收机制回收时,它占用的外部资源即被释放。造物主类型对象的类型几乎影响了该对象的所有功能,在某种程度上,对象的标识符也受其类型的影响。 原文地址 对象 对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示。每个对象均有标识符(identity)、类型(type)、值(val...

    douzifly 评论0 收藏0

发表评论

0条评论

Flands

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<