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
如果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也同样会改变,因为这个改变实际上是对对象的改变
四、关于==和is
在涉及到上面的引用之后,就会涉及到==和is的区别,==是判断两个对象的值是否相等,is是用来判断两个是否是一个对象
但是注意:在python中,小的整数和字符串是会被缓存并复用的,所以有的时候x is y会返回true