《Python学习手册》学习笔记(6)之第6章动态类型简介(关键词:编程语言/Python/变量/对象/引用)

来源:互联网 发布:卖家怎么设置淘宝转运 编辑:程序博客网 时间:2024/06/08 17:13

第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学习手册》。

阅读全文
0 0
原创粉丝点击