写在前面:一直以来通过查看网上各种大牛们的技术博客学习到不少知识,也解答了我不少疑难困惑。今天有感而发,恰逢刚学python,想到之前学习笔记都记到本子上,不方便且容易丢失,故开始博客记录学习心得之旅。
通过查看网上各种资料总结了一波java和python的变量内存管理机制,才疏学浅,如有错误之处请各位大牛批评指正。
Java:
变量有类型之分,分为基本数据类型和引用类型。声明变量时需要声明变量的类型,然后在内存的栈中根据声明的类型开辟一个内存空间。基本数据类型存放数据本身(比如int,直接在栈中存放数据),引用类型存放引用对象的地址。值得注意的是,string类型虽然是引用类型,但(str=”aaaa”)创建的对象是放在堆中的常量池中,函数调用情况类似于python中的不可变类型。
Python:
万物皆对象,包括int等。因此变量没有类型之分,统一存放引用对象的地址。此时变量可分为可变类型(数字,字符串,元祖)与不可变类型。可变类型变量函数调用情况与java中的常量池字符串类似。
函数调用情况:
可以理解为传递了一个原变量的拷贝,python中的不可变类型与java中的常量池字符串类似,在函数中修改变量指向的对象的值,实际上是重新创建一个新对象并修改函数中变量的指向,因此并不会影响原变量的指向。而可变类型与java中其他引用类型相似,修改变量指向的对象的值,等于直接对对象的值进行修改,因此会导致原变量的改变(这里的改变不是指原变量的指向地址改变,而是指向的对象内容的改变)。