c,c++和python变量讨论

来源:互联网 发布:元数据 数据字典 区别 编辑:程序博客网 时间:2024/04/29 21:31

c,c++为编译型语言,又称静态语言。变量的类型在编译时就确定了,并且分配了相应的内存空间,一定程度
上,变量就代表了这块内存空间,就像人名一样。Python为动态类型语言,变量只是一个名称而已,
不代表某个内存空间。

C语言中,变量就相当于一个盒子,盒子的名字就是变量,无论盒子里的内容怎么变,盒子及其名称一旦
确定(编译时),就不可再更改。C++亦是如此,但是c++同时也引入了引用的概念,引用不是普通的变量,
它是一个的别名,一个对某个内存空间的引用。由于c++是静态语言,所以一旦对某个内存空间绑定过后,引用就不可改变。Python中,变量全部是一个引用,一个对某个内存的引用
,是别名,加上其动态性的特点,所以变量可以绑定(bind)不同的内存空间。

三种语言的不同根本在于变量存储方式的不同(如上所说),从而导致其他方面的差异。

比如函数传值带来的差异:


比如对于函数:

void foo(int a)      /* c/c++ */
void foo(int &a)     // c++
def foo(a)           # python


)在调用foo(b)时,变量b的值被拷贝到栈中,并被赋给函数的局部变量a,然后无论局部变量a怎么改变,
对原来的b没有丝毫影响。
2)调用foo(b)时,变量b的别名被赋给a,这样a也就是了b的别名。函数体里对a的改变,直接影响到b的值。
函数结束时,a变量自动销毁。(下面函数体里的注释,是在调用函数时的情况)



3)调用foo(b)是,变量b被赋给a,a,b都是一块内存的别名,在函数体里,如果改变a的值,就要分情况讨论了
如果a引用的是不可变(immutable)对象,那么改变a,使得a绑定到另外一个内存,而对b及其绑定的对象
没有影响;


如果a引用的是可变(mutable)对象,而且又对a实施索引修改等操作(也就是对原内存进行修改),那么改变的
就是a,b所共同指向的那个内存空间,b所引用的空间内容就改变了,否则,a绑定到了另外一个内存空间,对a无影响。


在函数结束时,a被垃圾回收机制销毁,不复存在。

原创粉丝点击