01A06.Learning Python 5th-动态类型

本笔记是基于《Python学习手册-原书第五版》第六章 动态类型的个人理解。

动态类型提供了Python中的多态性,是Python语言简洁性和灵活性的基础。在Python中,类型是在运行时自动决定的,而不是通过代码声明。这个概念对变量,对象和它们之间的关系都适用。

变量、对象和引用

Python在代码运行之前先检测变量名。

当变量第一次被赋值时,变量就被创建了。

变量不会被它关联的类型信息约束。Python中类型的概念存在与对象中而不是变量中。

变量是在一个特定的时间点,简单地引用了一个特定的对象。

所有变量必须在使用前被赋值,使用未赋值的变量会产生错误。

# 变量赋值的内部视角
>>> a = 3
# 第一步,创建对象来代表3
# 第二步,创建一个变量a
# 第三步,将对象3与变量a进行连接

从内部视角看,变量事实上是到对象内存空间的一个指针。变量是对象的引用——引用是一种关系,通过内存中的指针的形式来实现。引用的实现非常像C语言中的void指针。

从技术上看,变量是一个系统表的入口,包含了指向对象的连接;对象是用来存储所代表值的一块内存空间;引用是自动形成的从变量到对象的指针。

对象不仅有足够空间表示它的值,每一个对象还有两个标准的头部信息——type designator(类型标识符)表示这个对象的类型;reference counter(引用计数器)决定何时收回这个对象。

>>> a = 1 #变量a指向了整数对象
>>> a = 'Python' #变量a指向了字符串对象
>>> a = 1.23 #变量a指向了浮点数对象

>>> type(1)
<class 'int'>
>>> type('Python')
<class 'str'>
>>> type(1.23)
<class 'float'>

当对象被变量所引用时,对象的引用计数器会记录该对象被引用的数量。如果引用计数器清零,该对象占用的空间就会被收回。这种自动回收对象空间的技术叫做垃圾回收。

共享引用

对象可以被多个变量共享引用。

>>> a = 3
>>> b = a
>>> id(a)
2212870449520
>>> id(b)
2212870449520
>>> id(3)
2212870449520
# 我们可以看出,a指向的是对象3的地址,b指向的也是对象3的地址。这在Python中被称为共享引用。

# 如果此时改变a的引用
>>> a = 'Python'
>>> a,b
('Python', 3)
# 会发现并不会对b产生影响

共享引用对可变对象和不可变对象的使用有差异。

# 面对不可变对象,a = a + 2实际上生成了一个新的对象再赋值给a。
>>> a = 3
>>> b = a
>>> a = a + 2
>>> a,b
(5, 3)

# 面对可变对象,a.append(3)实际上是对列表对象[1,2]的操作
>>> a = [1,2]
>>> b = a
>>> a.append(3)
>>> a,b
([1, 2, 3], [1, 2, 3])

# 因此Python在使用时要注意区分表达式是否对原对象进行了改变。
# 注意区分变量和对象的引用关系和对象的状态。


# ==运算符检测变量是否具有相同的值
# is 运算符检测变量是否指向同一个对象
>>> c = [1,2,3]
>>> a == c
True
>>> a is c
False
>>> a == b
True
>>> a is b
True

#如果想要查看对象计数器的次数的话
>>> import sys
>>> sys.getrefcount([1,2,3])
1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值