Posted by conan | Posted in 总结 | Posted on 25-09-2009
最近用python重写了天气预报,对python的变量名有了一些认识。
python的变量名和以前接触过的c/c++等完全不一样。c/c++的变量名的思想应该是这样,分配之后变量名就永远的关联到了编译器分配到的内存,任何对此变量名进行的操作都最终落实在对这段内存的操作上。
python中的变量名更像lisp的感觉,内存和变量名的关系并不是永远“绑定”的,这个变量名更像是一个指针,它指向了那个“变量”。
拿最简单的a=1来做例子。在c/c++中,=的意义是赋值,它对应的操作是把1赋值到a所指向的内存中。1这个表示在c/c++中是一个int型整数,存到a对应内存的是int型的整数1。为什么不同类型的赋值会出错?因为那个变量所指向的是一段可存储被赋值类型的内存空间,无法保证这个不同的类型在那段内存不出现问题。(由此引出的类型转换暂不考虑)如果再用b=a,则是将a的内容复制到b中去。在python中,=的意义虽然也是赋值,但是它做的完全不是这样的操作。根据python的声明,一切都是对象(变量名是不是还没有体会到),那么这个1也是对象,a=1就是将a指向1这个对象,而再用b=a则是将b指向a所指向的内容。那既然a和b都指向同一个地方,为什么修改了a之后b不变呢?举例,执行a=2,再看b的话你会发现还是1。其实这个还是惯性思维的原因。a=2实际上执行的操作是将a指向2这个对象,而不是将a所指向的内存改为2,所以a指向了2,而b还是指向1。可以体现这一点的比较容易的方法是用字符串。如果你用下标改了字符串的内容,两个“变量”都会变。
所以在python中,变量名不如叫名字(name)更为贴切,而在这种机制下,名字空间就显得尤为重要。
注:此文没有经过c/c++编译器及python解释器的证明,如有错误请指出,多谢

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.


