先来看看这段代码:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
这段代码执行的结果是ABC呢还是XYZ呢?
答案是
ABC
这是为什么呢?
很多教程都会告诉你,'ABC'是一个对象,把这个对象指向a,当b=a时,是把对象指向b,这点对于学过面向对象的同学来说会非常难以理解。
在很多面向对象语言中,变量是可以指向另一个变量的地址的。变量在栈里,变量的值在堆里,一个变量所标记的存储空间,可以写成一个值,也可以写成一个内存空间的地址。这个特性确保了,引用对象可以在函数方法间传递。
比如Java,如果 double a = 5000.0 ,5000.0会被直接存放在a变量的空间里,当将a赋值给b时,b会拷贝一份数据到自己的空间里,此时修改a不会影响b,修改b不会影响a。但是,如果写的是Double a = 5000.0,Double b = a,此时修改a或b,都会对另一个产生影响,因为这两个变量此时在自身空间中存储已经是一个引用地址了。类似于python当前的情况,但也不完全是。
而python压根不支持这一点。在python当中,数据是数据,变量是变量,变量只能存放内存地址。任何一个数据出现时,都会自动放入数据区域,并给出一个内存地址,当你想要将这个数据赋给某个变量时,就会简单的将这块数据的内存地址存入变量,当你将一个变量赋值给另一个变量时,也就简单的拷贝变量中存储的地址即可。
上述变量中存储的地址都是指数据的地址,不是变量本身的地址。
我们来总结一下:
python语言的变量只能存放数据块的内存地址,其他语言的变量不光可以存放内存地址,也可以直接存放普通数据类型。
网友评论