在Java和Python中,声明变量并初始化(赋值)后,会在栈或堆中给这个变量分配一片相应大小的内存(仅声明不赋值时,多数情况不分配有效内存),变量名本质是给内存地址取的名字,用于找到内存位置并操作其中存储的值。
1. Java 中的具体规则
Java 变量分两类,内存分配位置明确:
- 基本数据类型(int、float、boolean 等):
- 声明并赋值后,变量名对应的内存在栈内存中。
- 例如
int a = 10;,栈中直接存储a对应的内存地址, 内存中存10这个值,通过a可直接访问值。
- 引用数据类型(对象、数组、String 等):
- 变量名对应的内存在栈内存,其存着堆内存中实际的对象的地址;
- 对象的具体内容(属性、值)存储在堆内存。例如
User u = new User();,栈中有 u 对应的内存, 内存中是对象在堆内存中的地址,堆中存User对象的属性(如 name、age),通过 u 找到堆地址,再访问对象内容。
2. Python 中的具体规则
Python 中“一切皆对象”,内存分配逻辑更简化:
- 无论何种数据类型(int、list、dict、自定义对象等),变量名(引用变量)对应的内存都在栈内存,而变量对应的对象都存储在堆内存, 变量内存中存的是这个对象在堆内存中的地址。
- 例如
x = 5或y = [1,2,3],栈中仅存x, y为名的内存, 内存中是对象在堆内存中的地址,堆中存储5或列表[1,2,3]的实际数据,通过变量名找到堆地址即可操作值。 - 注意:Python 会对小整数(如 -5~256)、短字符串等做“缓存复用”,但本质仍是栈存引用、堆存对象,只是多个变量可能指向堆中同一块缓存内存。