让我们和python一起“动”起来
在上文一切皆对象中提到了python的变量a,并且特地指出它还有个叫法:标签。其实无论是叫“变量”还是叫“标签”都没特定的要求,叫它“变量”只是延续之前的编程习惯,叫它“标签”则是由python的动态特性决定的。
在此就C语言的“变量”与python的“标签”作个比较。C语言的变量在使用前需要对变量进行类型声明,而python的标签(变量)可以 直接使用,无需对标签(变量)进行类型声明,赋值给这个标签(变量)的对象是什么类型,它就是什么类型。
C语言:
main() { int a; char c; a = 1; c = ‘s‘; }
python:
a = 1 c = ‘s‘
再来看看python交互式命令行中的运行结果:
C语言的变量在赋值前有个声明变量类型的动作,其实这个动作就是针对这个变量类型开辟一个相应大小的内存空间。学过C的都知道不同类型的变量其数据长度不同,如整型变量int的数据长度是4字节,而字符型变量char的数据长度是1字节,这个数据长度就代表着其在内存中所占据空间的大小。C语言通过声明变量类型可有效利用内存空间资源。(sizeof()函数可用于查看变量的数据长度)
而python在对标签(变量)进行赋值时(python对标签的赋值解释成python对对象的引用会更直观),如果被赋值的对象是第一次被“引用”,则python(准确的说是python的编译器)会为这个对象开辟一个内存空间,内存空间的大小python会根据这个对象的类型和数据内容自动分配(python的sys包中有一个getrefcount()方法可返回对象的引用次数)。下面以python对象引用的一个过程图来完成今天的对python动态特性的介绍:
执行 a = k 相当于给在对象k的家门口贴小广告a,通过这个小广告a我们就可以找到对象k的家,从而找到对象k,之后想怎么对这个对象k就看你要怎么做了。而执行b = a 则相当于找到小广告a,在它旁边再贴上一个小广告b,或者通过 b = k 直接在k的家门口再贴上一个小广告b,这样,无论是通过小广告a还是小广告b都可以找到对象k。而id(k)(python中的内置函数,用于返回对象在内存空间的地址)相当对象k的房屋登记信息,通过查找房屋登记信息也可以获取对象k的住址。当然,小广告也有被撕掉的可能,但只要还有小广告则都可以根据小广告找到对象k的家,如果小广告被撕光了那就找不到对象k了。
ps:对于python的对象引用机制我只是从表面最容易理解的层次进行介绍,想引用的浅拷贝、深拷贝和垃圾回收机制并没有出现这里,之后会根据使用情况再分别介绍。python灵活的对象引用机制让python完全的“动”起来了,小伙伴再也不用为了声明各种各样的变量类型而苦恼了。
原文地址:https://www.cnblogs.com/3fman/p/9164217.html