python动态类型的简单理解

一、python中一个赋值语句以如下方式执行:以a=3为例

1、创建一个对象来表示值3

2、检测变量a是否已经被创建,如果没有,则创建

3、将变量a与第1步中创建的对象连接

具体地说,从技术层面上讲,对象有更加复杂的结构,而不仅仅是表示一个值这么简单,每个对象都有两个标准的头部信息:一个类型标识符和一个引用的计数器。类型标识符标识这个对象的类型,引用计数器用来表示当前有多少个变量引用了这个对象,一旦这个计数器被设置为0,那么这个对象就会被回收。

在python中要注意的一点:与传统编程语言,如C、C++等,python的变量没有类型,类型属于对象

二、对象的回收

在python中,每当一个变量名被赋予了一个新的对象,之前的那个对象占用的空间就会被回收(如果没有其他变量名引用的话),对象的空间自动放入自由内存空间池,等待后来的对象的使用。

三、共享引用以及对象在原处修改

现有如下语句:

a=3     b=a 在这里,b和a共同指向了对象3的地址,这时候如果添加语句a=4    最后的结果就是a=4 b=3,因为a=4实际上是又重新生成了一个对象4(数字的不可变性),a指向它,而b仍然指向3

python动态类型的简单理解

如果a指向的对象是可变的,比如是个列表或者字典:

a=[1,2,3]    b=a     这时候进行a.append(4),则最后的结果a=[1,2,3,4]   b=[1,2,3,4] 因为a.append(4)是在原对象上进行修改,而不是重新生成一个对象(列表是可变的),如果是b.append(4)  a也同样会改变,因为这个改变实际上是对对象的改变

python动态类型的简单理解

四、关于==和is

在涉及到上面的引用之后,就会涉及到==和is的区别,==是判断两个对象的值是否相等,is是用来判断两个是否是一个对象

python动态类型的简单理解

但是注意:在python中,小的整数和字符串是会被缓存并复用的,所以有的时候x is y会返回true

python动态类型的简单理解