python的动态类型

python的动态类型,第1张

python的动态类型 变量对象引用

为什么在python中不需要像c语言一样先声明对象的类型再对变量进行初始化呢?这就涉及到了python的动态类型

例子:

>>> a=3

当使用变量a来代表3时python会执行三个步骤:

1、分配内存空间来创建一个对象存储值3

2、创建一个变量a,如果还没被创建的话

3、将变量a与对象相连接

变量在赋值的时候才被创建,它可以引用任何类型的对象。变量实际上是到对象内存空间的一个指针。

类型属于对象而不是变量

在python中,对象有两个标准的头部信息:

(1)类型标志符:标示着这个对象的类型

(2)引用计数器:记录有多少个变量引用这个对象

变量名没有类型,类型属于对象。

垃圾回收机制()

当一个变量名被赋予一个新的对象,如果原来的对象没有被任何变量名所引用的话,之前对象占用的空间将被回收。

>>> x=42
>>> x='liu'

当变量x被连接到新的对象上时,之前的对象42将被清除。

对象的垃圾回收是通过引用计数器来实现的。当引用计数器为0时此对象将被清除。

共享引用与对象的修改

共享引用要求两个不同的变量能够引用同一个对象,指向相同的内存空间。

例子:

>>> L1=[1,2,3,4]
>>> L2=L1
>>> L2[1]=5
>>> L1
[1, 5, 3, 4]
>>> L2
[1, 5, 3, 4]

当L1与L2指向同一个对象时,通过L2改变第二个数的值,通过L1显示也发现改变了。这是因为通过变量修改了对象内存空间里的值,两个变量指向同一块内存空间,所以通过一个变量修改值,另一个变量也会显现出修改后的状态。

这种行为仅支持原位置可改变的可变对象,如列表、字典等,但当对象是字符串或数字时,不能进行修改。

在程序中应当尽量避免出现上述例子的情况,可以使用copy()方法来复制一个对象,复制后的对象与原对象在不同的内存空间。

>>> L1=[1,2,3,4]
>>> L2=L1.copy()
>>> L2[1]=5
>>> L1
[1, 2, 3, 4]
>>> L2
[1, 5, 3, 4]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5581143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存