此处延伸下变量和对象之间的关系:
- 赋值操作,本质是创建引用
- 变量是变量,对象是对象,当将某个对象赋值给某个变量时,可以认为是创建了变量对该对象的引用
- 变量没有数据类型之说,只有对象有,即变量不是直接代表对象或对象占用的内存空间
- Python中,变量无需提前声明,无需指定其数据类型,其表现完全是动态的,其所为的数据类型决定于当前该变量所引用的对象的数据类型
- 所谓变量对对象的引用,本质是创建了变量指向对象内存空间的指针
- 对象内存空间,一般最起码有类型和当前被引用次数这两个信息,类型记录了该对象的数据类型,被引用次数记录了该对象内存空间被变量引用的次数
- 当某对象的被引用次数为0时,Python便会自动回收该对象内存空间
比如下面的
a=10
a='122'
a=[1,2,3]
del a
此时,a在不同的赋值代码行中,引用的对象类型不同,相当于在不断改变a引用的对象,最后当把a变量删除时,其实本质只是删除了a变量名,但由于a引用的[1,2,3]对象,因为a被删除,其被引用次数变为0,也就自动被Python回收,最终表现就是del a时,[1,2,3]也被删除了。
另外一个小知识是,Python为提升代码执行和内存分配效率,会对一些常用的对象提前创建好,并常驻内存,比如下面:
id(4)#不管运行多少次该代码,其返回的值均不变,因为python会保持一些常用的数字常驻内存,不会每次都重新分配内存空间
id('hello world')#每次运行,返回的值均会发生变化,因为每次运行,相当于都在重新分配内存空间