动态类型以及由他提供的多态性是Python语言简洁性、灵活性的基础。Python中,类型是在运行过程中自动决定的,没有必要事先声明变量。记住,Python中变量和对象是划分开来的,这样才能能清楚的理解动态类型。再记住,赋值生成的是变量到对象的引用,而非拷贝。
1,单个变量引用
以a=3为例说明Python中单个变量引用的处理过程,
1)创建一个对象代表值3,此处是整型数字对象
2)如果变量a还没有被创建的话,创建变量a(已创建则无此步骤)
3)将变量与新的对象3连接
实际效果如下图所示,变量a和对象3保存在内存中的不同部分,通过连接相关联(C语言中变量名和变量值是一体的),从变量到对象的连接称为引用,引用就是自动形成的从变量到对象的指针。
Python中,变量名没有类型,它属于系统表的元素,同一个变量可以引用不同的对象类型(python中的变量类似于C语言中的void *型空指针,可以指向任意的数据类型)。对象才分类型,每个对象都有两个标准的头部信息:一个类型标识符表示对象类型,一个引用计数器来决定该对象是否可以被回收(计数器为0时回收对象)。每当一个变量被指向一个新的对象,若该变量之前指向的对象引用数已为0则该对象的内存空间就被Python自动回收--垃圾回收。正是这种垃圾回收机制,才使得Python中可以任意使用对象而不用担心内存释放等问题,这就省去了大批基础代码。
2,共享引用
1)不可变对象(数字、字符串、元组)的共享引用
多个变量引用同一个对象时,变量之间实质上是毫无关系的,分别创建了对同一个对象的引用。改变任何一个变量的引用并不影响其他变量。
a=3
b=a
分析上述语句阐述共享引用的处理,这里Python将创建变量a、b分别指向同一个整数对象3(即引用计数器为2),如下图。
若键入语句a=a+2,则是将变量a指向新的对象5,并不改变对象3的值(整数对象的不可变性),也并未改变变量b的引用。
a=‘spam’
python执行上一句之后,变量a、b的引用情况变为:
2)可变对象(列表、字典)的共享引用
可变对象的共享引用必须加倍小心,因为此时通过对一个变量的修改(当然,修改的是对象的值)也就影响到了其他变量,这类似与C语言中的函数引用传递或者多个指针指向同一段内存。标准库的copy模块可用来复制一个对象。