Python中变量的处理与C语言大不相同。Python中的变量具有特殊的属性:身份,即“身份徽标”。在许多地方,此特殊属性也称为“参考”。
为了更清楚地说明引用的问题,我们必须首先介绍两个工具:Python的构建功能:;一个操作员:;同时,我们还必须在模块中引入功能:。
返回值是对象中引入的“徽标”。此标识是一个唯一的常数,与传输对象的生命周期之一相对应。两个在生命周期中不重合的对象可能具有相同的回报值。
CPYTHON实现细节:这是内存中对象的地址。
CPYTHON实现详细信息:“标识”实际上是内存中对象的地址。
- - 摘自“ Python 3.7.4文档构建的功能-ID()”
换句话说,是否由Cpython实现,可以将对象视为其虚拟内存地址。
IS对象身份的作用是比较对象的标识符。
- “ Python 3.7.4文档构建类型”的报价
返回对象的参考计数。计数返回比您预期的要高,因为它包括(临时)引用作为争论t。
返回值是对象的参考计数。由于引入参数时,生成了临时参考,因此返回值通常比预期的1多1。
- 摘自“ Python 3.7.4文档模块 - 系统相关参数和函数”
此处的“参考计数”在Python文档中定义为“引用对象的次数”。一旦计数引用零,即对象的位置的内存。这是自动内存管理的机制内部的python。
在C语言中,变量代表固定内存,并且给出的变量的值是该地址中的数据。但是对于Python而言,该变量不再是固定地址,而只是python.tag中附加到对象的各种地址。理解这对于Python的许多特征非常重要。
例如,对于以下C代码:
对于具有C语言编程经验的人,上述结果很明显:由于其值的变化,变量的地址不会更改。对于C编译器,变量仅帮助其区分每个内存地址的徽标,该徽标是直接绑定的到特定的内存地址,如图所示:
但是python是不同的。考虑以下代码:
这有点有趣。更令人惊讶的是,即使给出与变量相同的常数,也可能有所不同:
如果相应的数据类型是列表,则:
他们获得的值也不同。
如前所述,在Python中,变量是一个砖头,可以移动。每个时间将新对象分配给变量,将对象重新创建在内存中。该对象有一个新的参考值。作为“标签”,需要发布变量,没有时间来做。
但是应该指出的是,这里还有另一个问题:“即使给出了变量相同的常数,也可能有所不同”的原因。实际上,这并不是因为这种情况在所有常数中都不存在。举例来说,以下结果:有以下结果:
可以看出,常数对应于相同,并且没有变化,因此变量没有更改。
这是因为Python在内存中维护一定数量的常数池,并且在一定范围内没有创建新的对象,并且直接在此常数池中分配了。该常数池的范围为[0,256],而256只是可以用字节表示的二进制代码数量。
相应地,如果该值被分配,减去和乘以,并且结果被分配给原始变量,则将更改与该变量相对应的参考值:
可以看到比较块第3和8行的输出结果,即数值变量的执行方法和分配的执行方法将将参考值更改为应变。应该更好地理解性能。因为根据优先级实际上,python运算符添加了与变量相对应的值后,给出了新值,然后给出了该新值,因此参考将会更改。列表对于列表是正确的:
与值不同,python中列表对象的操作也显示了另一个特征。请考虑以下代码:
观察代码块的第三,第8和13行的三行,具有相同的输出。。
此外,如果两个变量同时引用同一列表,则其中一个变量本身将直接影响另一个变量的值:
显然,此时的变量与之一致。现在更改了引用的列表值:
您可以看到引用的列表值也会更改。查看相应的位置:
这两个变量都没有更改。再次称呼该方法:
删除元素:
在上述所有操作中,没有任何对相应元素的引用不会更改。
换句话说,变量本身的操作不会创建新对象,而是会直接更改原始对象的值。
本节中的示例灵感来自[关于Python的报价]
数值数据和列表有特殊差异。请考虑以下代码:
对于先前的路面,此结果非常自然。明显地,当将1个操作添加到变量时,将计算新值并执行分配操作,因此参考已更改。
但是列表不是。请参阅以下代码:
注意第4行。这是“额外和偿还”操作。为什么与正面有不同的结果?检查变量的值,并发现变量的值会更改,但是引用没有更改。
实际上,这是因为在Python中增加了额外的负载。对于列表对象和数值对象,附加操作的基础实现完全不同。在简单的添加中,列表的列表仍然创建一个新的新操作。清单对象;但是在缩写的附加添加中,没有新列表对象。请注意。
早期(第3天:Python变量和数据类型)我们提到,Python中的六种标准数据类型实际上分为两个类别:可变数据和无法变量的数据。它们,它们,列表,字典和集合是“可变对象”是“可变对象”;数字,字符串和乌龟组是“不令人满意的对象”。实际上,数值数据(即,数字)和上述列表之间的差异是由这两种不同的数据类型引起的。
因为数字是一个不变的对象,所以我们无法执行任何可以更改数据值本身的操作。
前9行的代码易于理解:即使相同的值也可能具有不同的参考值。关键是该值是否来自同一对象。
第12行的代码表明,除了函数的引用外,变量引用的对象仅是一个引用,即变量。一旦释放变量,相应的对象参考计数为零,并且将被释放。仅在此时,与此对象相对应的内存空间才是真实的“释放”。
作为变量对象,可以在没有新对象的情况下更改列表的值。因此,列表对象本身可以直接操作,该对象可以实现“更改变量值而不更改引用”的目的。
对于列表,字典和集合的“变量对象”,通过变量引用的参考对象的操作,它只能更改变量的值而不更改变量的参考;”因为对象本身无法操作变量值,如果要更改相应变量的值,则必须创建一个新对象,然后将新对象分配给变量。
通过这样的询问,您还可以更加生动地理解“万物中所有事物”的深刻含义。0
示例代码:Python-100天
原始:https://juejin.cn/post/7103441305623068703