python(2): 动态数据类型系统(内容存疑,只是..
时间:2007-03-30 来源:marlboro027
python使用动态数据类型系统。在python之中所有变量都是引用型的。这与c中是不同的。来看下面一段c代码:
总之,可以说,一个变量标识符就可以看成是一块内存空间。在编译完成后,所谓的 这些标识符都不存在了,都被类似于“把内存第...位到第...位的内容置为...”这样的指令代替了。对于电脑硬件来说,内存里的东西都是0和1组成的 串,相互之间没有什么区别,对于硬件的操作来说,只要提供从哪个bit开始、操作多少bit、每位的内容是什么、是0还是1的信息就可以了。至于比如说 “第1位到第32位代表a”,这是编译器和程序的事。另一个程序也可以把相同的串解释成“老婆快要生孩子了”。由此也可以推断出,编译器在编译程序时,会 维护一个变量名到首地址的映射表,当然也会有长度信息。
下面来看python中类似的代码:
3
这一行代码只有一个数字“3”,但系统也会为它分配内存空间,只不过是在分配后就立刻丢弃了,因为没有人用它。
所以"a=3"在python中的实现过程是这样的:
创建a对象,创建"3"这个整数对象,把“3”这个整数对象的首地址放在a中。
所以,第3行代码的意思是把a指向"4"这个对象。那么由于b指向的“3”对象仍在那儿,b的值仍为3。
当然,这也有例外,比如说有一个:
a = [1,2,3]
b = a
a[0] = 4
这时:
>>> print a
[4,2,3]
>>> print b
[4,2,3]
可以看到b的值也变了。这也好理解。
前 面也说到了,在python中一个资源不用后,立刻就会回收了。这跟java是不一样,python的机制非常明确,不用就回收了。而在java中,垃圾 收集器是不定期启动的,这样的话java就可以等到资源废弃到一定程度后在启动垃圾收集器进行一次大扫除,因为启动垃圾收集器系统开销不小,java的方 式应该会更有效率。
- int a,b;
- a = 3;
- b = a;
- int* a;
- int* b;
- a = new int;
- b = new int;
- *a = 3;
- b = a;
- *a = 4;
总之,可以说,一个变量标识符就可以看成是一块内存空间。在编译完成后,所谓的 这些标识符都不存在了,都被类似于“把内存第...位到第...位的内容置为...”这样的指令代替了。对于电脑硬件来说,内存里的东西都是0和1组成的 串,相互之间没有什么区别,对于硬件的操作来说,只要提供从哪个bit开始、操作多少bit、每位的内容是什么、是0还是1的信息就可以了。至于比如说 “第1位到第32位代表a”,这是编译器和程序的事。另一个程序也可以把相同的串解释成“老婆快要生孩子了”。由此也可以推断出,编译器在编译程序时,会 维护一个变量名到首地址的映射表,当然也会有长度信息。
下面来看python中类似的代码:
- a = 3
- b = a
- a = 4
3
这一行代码只有一个数字“3”,但系统也会为它分配内存空间,只不过是在分配后就立刻丢弃了,因为没有人用它。
所以"a=3"在python中的实现过程是这样的:
创建a对象,创建"3"这个整数对象,把“3”这个整数对象的首地址放在a中。
所以,第3行代码的意思是把a指向"4"这个对象。那么由于b指向的“3”对象仍在那儿,b的值仍为3。
当然,这也有例外,比如说有一个:
a = [1,2,3]
b = a
a[0] = 4
这时:
>>> print a
[4,2,3]
>>> print b
[4,2,3]
可以看到b的值也变了。这也好理解。
前 面也说到了,在python中一个资源不用后,立刻就会回收了。这跟java是不一样,python的机制非常明确,不用就回收了。而在java中,垃圾 收集器是不定期启动的,这样的话java就可以等到资源废弃到一定程度后在启动垃圾收集器进行一次大扫除,因为启动垃圾收集器系统开销不小,java的方 式应该会更有效率。
相关阅读 更多 +