第6章 动态类型简介
写在开头的读者笔记
值得一读的小节
1.缺少类型声明语句的情况
缺少类型声明语句的情况 - 变量、对象和引用
1.1.主要学到了,一条简单的赋值语句时,在Python内部,到底发生了什么:
>>> a = 3
Python会执行3个步骤去完成这个赋值的操作:
- 创建一个对象来**代表值**3;
- 创建一个变量a,如果它还没有创建的话;
- 将变量与新的对象3相连接。
变量和对象保存在内存中的不同部分,并通过连接相关联。变量总是连接到对象。
运行a=3后,变量a变成对象3的一个引用。在内部,变量事实上是到对象内存空间(通过运行常量表达式3而创建)的一个指针。
在Python中,从变量到对象的连接称作引用。引用是一种关系,以内存中的指针的形式实现。一旦变量被使用(也就是说被引用),Python自动跟随这个变量到对象的连接。以具体的术语来讲:
- 变量是一个系统表的元素,拥有指向对象的连接的空间。
- 对象是分配的一块内存,有足够的空间去表示它们所代表的值。
- 引用是自动形成的从变量到对象的指针。
每一次通过运行一个表达式生成一个新的值,Python都创建了一个新的对象(换言之,一块内存)去表示这个值。从内部看,Python**缓存了不变的对象并对其进行复用**。但是,从逻辑的角度看,这工作起来就像每一个表达式的结果的值都是一个不同的对象,而每一个对象都是不同的内存。
每一个对象都有两个标准的头部信息:一个类型标志符去标识这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。
缺少类型声明语句的情况 - 类型属于对象,而不是变量
1.2.
>>> a = 3
>>> a = 'spam'
>>> a = 1.23
在Python中,变量名没有类型。类型属于对象,而不是变量名。前面的例子中,我们只是把a修改为对不同的对象的引用。因为变量没有类型,实际上并没有改变变量a的类型,只是让变量引用不同类型的对象而已。实际上,Python的变量就是在特定的时间引用了一个特定的对象。
对象知道自己的类型。每个对象都包含了一个头部信息,其中标记了这个对象的类型。例如,整数对象3,包含了值3以及一个头部信息,告诉Python,这是一个整数对象。
Python的类型是与对象相关联的,而不是和变量关联。
本书提到的这个代码有两个头部信息,一个是类型标志符,另一个是引用计数器。
缺少类型声明语句的情况 - 对象的垃圾收集
1.3.
>>> a = 3
>>> a = 'spam'
每当一个变量名被赋予了一个新对象,之前的那个对象占用的内存空间就会被回收(如果它没有被其他的变量名或对象所引用的话)。这种字段回收对象空间的技术叫做垃圾收集。
>>> x = 42
>>> x = 'bery'
>>> x = 3.14
>>> x = [1, 2, 3]
对象的引用值在此过程中逐个被丢弃。每一次x被赋值给一个新的对象,Python都回收了对象的空间。当赋值为’bery’时,对象42马上被回收(假设它没有被其他对象引用):对象的空间自动放入自由内存的空间池,等待后来的对象使用。
在内部,Python在每个对象中保持了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦(并精确在同一时间)这个计数器被设置为零,这个对象的内存空间就会被自动回收。
缺少类型声明语句的情况
变量、对象和引用
(读者:
>>> a = 3
Python会执行3个步骤去完成这个赋值的操作:
- 创建一个对象来**代表值**3;
- 创建一个变量a,如果它还没有创建的话;
- 将变量与新的对象3相连接。
变量和对象保存在内存中的不同部分,并通过连接相关联。变量总是连接到对象。
运行a=3后,变量a变成对象3的一个引用。在内部,变量事实上是到对象内存空间(通过运行常量表达式3而创建)的一个指针。
在Python中,从变量到对象的连接称作引用。引用是一种关系,以内存中的指针的形式实现。一旦变量被使用(也就是说被引用),Python自动跟随这个变量到对象的连接。以具体的术语来讲:
- 变量是一个系统表的元素,拥有指向对象的连接的空间。
- 对象是分配的一块内存,有足够的空间去表示它们所代表的值。
- 引用是自动形成的从变量到对象的指针。
每一次通过运行一个表达式生成一个新的值,Python都创建了一个新的对象(换言之,一块内存)去表示这个值。从内部看,Python**缓存了不变的对象并对其进行复用**。但是,从逻辑的角度看,这工作起来就像每一个表达式的结果的值都是一个不同的对象,而每一个对象都是不同的内存。
每一个对象都有两个标准的头部信息:一个类型标志符去标识这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。
)
类型属于对象,而不是变量
>>> a = 3
>>> a = 'spam'
>>> a = 1.23
在Python中,变量名没有类型。类型属于对象,而不是变量名。前面的例子中,我们只是把a修改为对不同的对象的引用。因为变量没有类型,实际上并没有改变变量a的类型,只是让变量引用不同类型的对象而已。实际上,Python的变量就是在特定的时间引用了一个特定的对象。
对象知道自己的类型。每个对象都包含了一个头部信息,其中标记了这个对象的类型。例如,整数对象3,包含了值3以及一个头部信息,告诉Python,这是一个整数对象。
Python的类型是与对象相关联的,而不是和变量关联。
本书提到的这个代码有两个头部信息,一个是类型标志符,另一个是引用计数器。
对象的垃圾收集
(读者:
>>> a = 3
>>> a = 'spam'
每当一个变量名被赋予了一个新对象,之前的那个对象占用的内存空间就会被回收(如果它没有被其他的变量名或对象所引用的话)。这种字段回收对象空间的技术叫做垃圾收集。
>>> x = 42
>>> x = 'bery'
>>> x = 3.14
>>> x = [1, 2, 3]
对象的引用值在此过程中逐个被丢弃。每一次x被赋值给一个新的对象,Python都回收了对象的空间。当赋值为’bery’时,对象42马上被回收(假设它没有被其他对象引用):对象的空间自动放入自由内存的空间池,等待后来的对象使用。
在内部,Python在每个对象中保持了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦(并精确在同一时间)这个计数器被设置为零,这个对象的内存空间就会被自动回收。
)
共享引用
共享引用和在原处修改
共享引用和相等
动态类型随处可见
本章小结
本章习题
本章解答
参考文献:
1.《Python学习手册》。