Python是动态类型语言
你知道为什么Python中声明一个变量而不需要提前声明类型吗?
变量只是对象的引用,不存在类型这个概念
而对象是一块内存空间里的数据,对象的头部会标记自己的类型 还有一个时引用计数器 当对象被一个变量引用是计数器就是1 当计数器为0 则销毁
比如
x = 1
x = 'hello' 此时对象1的计数器为0自动销毁
a=3
b=a
思考这中间的引用关系?注意int类型在Python中是不可变的
对象的垃圾回收机制: 因为对象存在内存中如果不定期清除的话 会浪费内存,可以根据对象的引用计数器来销毁自身
a = 3 a的内存地址123
b = a b的内存地址123
a = 3 a的内存地址123
b = a b的内存地址123
a = 'spam' a的内存地址为1234 b的内存地址依然为123
当a='spam'时并不是在原来的内存空间将3修改为'spam' 而是重新开辟新的内存空间放了一个新的对象为'spam' 这就是int类型不可变的特性,元祖,也是,也有一些是可以在原出修改的 列表 字典 通过class定义的类
L1 = [2,3,4]
L2 = L1
L1 = 23 此时L1直接设置为不同的对象 L2则还是指向[2,3,4]这个列表
但是如果
L1[0] = 23 此时L1和L2还是引用相同对象 这种情况的话修改某个变量可能会对程序其他部分产生影响
可以通过复制对象来避免这一现象的发生
L2 = L1[:] 这样就想当与拷贝了 而不是直接引用L1的内存空间
共享引用和相等:
a = [1,2,3]
b = [1,2,3]
a == b 值相等就ok
True
a is b 内存地址不同,不是同一个对象
False
a =1
b = 1
a is b
True 这是因为Python的缓存机制 小的整数和字符串被缓存并且复用了
import
sys.getrefconut(1) 查询对象1引用次数
应为不能改变数字和字符串所以对一个对象有多少次的引用都没有关系 这也是Python执行速度优化方法的一种