摘要:每个对象均有标识符类型值。通常我们认为当这些对象被垃圾回收机制回收时,它占用的外部资源即被释放。造物主类型对象的类型几乎影响了该对象的所有功能,在某种程度上,对象的标识符也受其类型的影响。
原文地址
对象对象(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
⭐️前面的话⭐️ 大家好!这是Java基础知识与数据结构博文的导航帖,收藏我!学习Java不迷路! ?博客主页:未见花闻的博客主页 ?欢迎关注?点赞?收藏⭐️留言? ?本文由未见花闻原创,CSDN首发! ?首发时间:?2021年11月11日? ✉️坚持和努力一定能换来诗与远方! ?参考书籍:?《Java核心技术卷1》,?《Java核心技术卷2》,?《Java编程思想》 ?参考在线编程网站:?牛...
摘要:数字世界的演化需要万物有灵,万物有灵就需要有支配万物思想行为活动的大脑,这个是数字世界中万物之个体能够成长并形成独立物格的基础。 上帝说:要有光!于是,就有了光。在无限光芒的照耀下,我们物理世界开始进行演化,然后有了生物的产生和人类文明的诞生和发展。这西方圣经的创世篇,就如我...
摘要:各企业机构目前普遍有一个新的需求,即跨广域网使用云功能,并在网络边缘进行微小化部署。认为,边缘计算描述的是一种计算拓扑。 最近,有越来越多的公司开始使用跨多个站点和网络的分布式基础设施,以实现云计算体系结构的简化管理和灵活性。各企业机构目前普遍有一个新的需求,即跨广域网使用云功能,并在网络边缘进行微小化部署。尽管这样的运营模式还处于早期阶段,但许多新出现的用例和场景将从这样的分布式基础...
阅读 1525·2021-09-23 11:21
阅读 2318·2021-09-07 10:13
阅读 817·2021-09-02 10:19
阅读 1096·2019-08-30 15:44
阅读 1706·2019-08-30 13:18
阅读 1893·2019-08-30 11:15
阅读 1078·2019-08-29 17:17
阅读 1992·2019-08-29 15:31