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]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值