资讯专栏INFORMATION COLUMN

万物之基础——对象

douzifly / 407人阅读

摘要:每个对象均有标识符类型值。通常我们认为当这些对象被垃圾回收机制回收时,它占用的外部资源即被释放。造物主类型对象的类型几乎影响了该对象的所有功能,在某种程度上,对象的标识符也受其类型的影响。

原文地址

对象

对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示。每个对象均有标识符(identity)、类型(type)、值(value)

标识符。对象一旦创建,那么它的标识符就不会改变,可以把标识符看作对象在内存中的地址。_is_ 操作可以用来比较两个对象的标识符,函数_id()_用来返回对象标识符(python中返回对象在内存中的地址)。

类型。对象的类型也是不可变的,对象的类型决定了该对象支持的操作,另外也决定了该对象可能的值。_type()_函数返回一个对象的类型。

值。一些对象的值可以改变,我们叫它可变对象,字典和列表均属于可变对象;值不可改变的对象我们叫它不可变对象,数字、字符串、元组均属于不可变对象。

python不像C那样需要显式地回收对象占用的空间,python内核中有垃圾回收机制,当一个对象不可达时,就会交由垃圾回收机制处理。

一些对象引用了一些外部资源,例如打开的文件或者窗口。通常我们认为当这些对象被垃圾回收机制回收时,它占用的外部资源即被释放。但是,垃圾回收机制并不一定会回收这些对象,因此这些对象提供了显式的方法(通常是_close()_)用来释放外部资源。程序中最好使用显式的方法来释放外部资源,一般可以使用 try...finally 方便地释放。

造物主:类型!

对象的类型几乎影响了该对象的所有功能,在某种程度上,对象的标识符也受其类型的影响。

先看下面的程序:

>>> sum = 15
>>> sum_add = 12 + 3
>>> sum is sum_add
True
>>> sum = 15000000
>>> sum_add = 10000000 + 5000000
>>> sum is sum_add
False
>>> sum_add == sum
True

对于不可变对象(这里是int),当我们需要一个新的对象(sum_add = 12 + 3)时,python可能会返回已经存在的某个类型和值都一致的对象(sum)的引用。当然,这里只是可能会返回已经存在的对象,要看python的具体实现。同样是创建新的对象sum_add = 10000000 + 5000000,python并没有把值和类型都一样的sum返回给sum_add。

>>> value = []
>>> value_1 = []
>>> value is value_1
False
>>> value == value
True
>>> value = value_1 = []
>>> value is value_1
True

对于可变对象,当我们需要新的对象时,python一定会为我们新建一个。注意,这里value = value_1 = []将会创建一个空的列表对象,然后同时返回给value和value_1。

扑朔迷离的不可变对象

首先看下面的代码:

>>> mutability = [1, 2, 3, 4]
>>> immutability = (0, mutability, 5)
>>> immutability
(0, [1, 2, 3, 4], 5)
>>> mutability[2] = "see here!"
>>> immutability
(0, [1, 2, "see here!", 4], 5)

这里元组immutability中一个元素为可变对象列表mutability,当我们改变mutability的值时,号称不可变对象的元组的值竟然发生了变化。这又是为什么呢?

回答这个问题前,先总结下上面这段代码发生了什么:不可变对象A包含了一个对可变对象B的引用,可变对象B的值发生改变时,A的值也会发生改变。

那么,为什么我们仍认为A是不可变对象呢?因为A仍然包含对象B,而B的标识符并没有发生变化,也就是说A的所有元素的标识符并没有发生变化。其实严格来讲,不可变对象的值是可以改变的,这里是很微妙的哦,需要好好品味。看下面的代码吧:

>>> mutability = [1, 2, 3, 4]
>>> id(mutability)
4394446720
>>> immutability = (0, mutability, 5)
>>> id(immutability[1])
4394446720
>>> mutability[2] = "see here!"
>>> id(mutability)
4394446720
>>> id(immutability[1])
4394446720

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

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

相关文章

  • JavaSE与数据结构基础知识系列——专栏导航

    ⭐️前面的话⭐️ 大家好!这是Java基础知识与数据结构博文的导航帖,收藏我!学习Java不迷路! ?博客主页:未见花闻的博客主页 ?欢迎关注?点赞?收藏⭐️留言? ?本文由未见花闻原创,CSDN首发! ?首发时间:?2021年11月11日? ✉️坚持和努力一定能换来诗与远方! ?参考书籍:?《Java核心技术卷1》,?《Java核心技术卷2》,?《Java编程思想》 ?参考在线编程网站:?牛...

    Cc_2011 评论0 收藏0
  • JS修仙一界本源

    摘要:时间一晃就是数月,齐云早已把界基本情况了解了,不过至于三座大山里隐藏的谜团却迟迟没有头绪。它是界本源之一。事实上,根本没有构造函数,或者人人都是构造函数。所以,明白这个界的一界本源,才能在这里畅游天地之间。 自计算机宇宙诞生以来,有很多大神通者在这里开天辟地,开创了很多界,有C、C++、Java等世界,它们彼此相连,其中有一处叫做JavaScript的世界,自被开辟以来吸引了很多修行者...

    I_Am 评论0 收藏0
  • IOT数字世界技术论(上)

    摘要:数字世界的演化需要万物有灵,万物有灵就需要有支配万物思想行为活动的大脑,这个是数字世界中万物之个体能够成长并形成独立物格的基础。         上帝说:要有光!于是,就有了光。在无限光芒的照耀下,我们物理世界开始进行演化,然后有了生物的产生和人类文明的诞生和发展。这西方圣经的创世篇,就如我...

    不知名网友 评论0 收藏0
  • 一文带你读懂边缘计算是什么

    摘要:各企业机构目前普遍有一个新的需求,即跨广域网使用云功能,并在网络边缘进行微小化部署。认为,边缘计算描述的是一种计算拓扑。 最近,有越来越多的公司开始使用跨多个站点和网络的分布式基础设施,以实现云计算体系结构的简化管理和灵活性。各企业机构目前普遍有一个新的需求,即跨广域网使用云功能,并在网络边缘进行微小化部署。尽管这样的运营模式还处于早期阶段,但许多新出现的用例和场景将从这样的分布式基础...

    dadong 评论0 收藏0

发表评论

0条评论

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