Python 变量的本质

Python 变量的本质

  1. 当我们写:a = ‘ABC’时,Python解释器干了两件事情:

    一、在内存中创建了一个’ABC’的字符串;

    二、在内存中创建了一个名为a的变量,并把它指向’ABC’。

    即,在Python中:

    1. 和其他编程语言一样的是,变量是内存地址的别名,即a代表了地址0x1002;
    2. 和其他编程语言不一样的是,Python中的变量和数据分开存储:变量a所代表的地址0x1001处仅保存了数据20存储的内存地址0x1002。
    3. 变量a所标示的内存空间存储数据20所在内存地址的过程称为引用。

变量与地址

在这里插入图片描述
我们看到,当a,b都是2.0时,它们的地址不一样,说明系统为a,b分配了不同的内存空间。但是,当a,b都是2时,它们的地址是一样的,怎么回事呢?这是因为,为了提高内存空间的利用效率,对于一些比较小的整型变量(int)使用了相同的内存空间。如果数值比较大,地址就不一样了。

参考文章:

  1. https://blog.youkuaiyun.com/weixin_37780776/article/details/105302633?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.channel_param
  2. https://blog.youkuaiyun.com/qq_34979346/article/details/83691195?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-5&spm=1001.2101.3001.4242
  3. https://blog.youkuaiyun.com/qq_33679504/article/details/80516466?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
  4. https://blog.youkuaiyun.com/WSBruce/article/details/79234389?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
<think>我们正在讨论Python变量本质。根据引用,Python变量与其他语言(如C)不同。在C中,变量是内存位置的命名,而在Python中,变量更像是指向对象的标签(引用)。让我们一步步分析:1.**Python变量的实质**:引用[2]提到,Python变量实质上是对象的引用。当我们给变量赋值时,实际上是将变量名绑定到一个对象上。例如:```pythona=5```这里,整数`5`是一个对象,而`a`是一个引用,指向这个对象。2.**内存表示**:引用[1]指出,Python使用类似堆的方式管理内存。对象存放在堆中,而变量名只是指向这些对象的引用。引用[3]进一步说明,当我们给变量赋新值时,实际上是创建了一个新对象(除非是小的整数,如引用[2]提到的小整数缓存),然后变量引用这个新对象。例如:```pythona=5b=ab=10```此时,`a`仍然指向`5`,而`b`指向`10`。因为整数是不可变对象,所以修改`b`不会影响`a`。3.**可变与不可变对象**:对于可变对象(如列表),情况有所不同:```pythonlist1=[1,2,3]list2=list1list2.append(4)```这时,`list1`和`list2`都指向同一个列表对象,所以修改`list2`也会影响`list1`。4.**内存地址**:我们可以使用`id()`函数查看变量引用的对象的内存地址。如果两个变量的`id`相同,则它们引用同一个对象。5.**小整数缓存**:引用[2]提到,Python对在[-5,256]范围内的小整数进行了缓存,所以多次赋值这个范围内的整数,变量可能会引用同一个对象。总结:Python变量实质上是对象的引用(指针),变量名与对象之间的绑定是动态的。内存中,对象存储在堆上,变量名存储在命名空间中(如局部命名空间在栈上,全局命名空间在堆上),但变量名存储的是对象的地址。§§相关问题§§1.什么是Python中的可变对象和不可变对象?请举例说明。2.如何理解Python中的变量赋值与浅拷贝、深拷贝的区别?3.为什么在Python中修改一个列表有时会影响另一个列表?4.Python的内存管理机制是怎样的?垃圾回收是如何工作的?</think>### Python变量本质与内存表示 Python变量的实质是**对象引用**(object reference),而非直接存储数据的容器。变量本质上是内存中对象的标签或指针,指向存储实际数据的对象。这种机制与C/C++等语言有本质区别[^1][^3]。 #### 内存表示机制 1. **变量名与对象分离**: - 变量名(如`x`)存储在命名空间(字典结构)中 - 实际数据存储在堆内存的对象中 - 变量名通过指针关联对象 ```mermaid graph LR A[变量名 x] --> B[内存地址 0x7f8a] B --> C[对象 int 5] ``` 2. **赋值过程**: ```python a = 5 b = a ``` - 创建整数对象`5`(若在[-5,256]范围则复用缓存对象[^2]) - `a`和`b`都指向同一内存地址 - 使用`id(a) == id(b)`可验证地址相同 3. **修改时的行为**: ```python b = 10 # 创建新对象,b指向新地址 ``` - 不可变对象(如int, str, tuple):修改变量会创建新对象 - 可变对象(如list, dict):修改内容不改变对象地址 ```python lst1 = [1,2] lst2 = lst1 lst2.append(3) # lst1也变为[1,2,3] ``` 4. **内存管理特征**: - **引用计数**:对象被引用次数为0时自动回收 - **小整数缓存**:-5至256的整数常驻内存[^2] - **垃圾回收**:解决循环引用问题(如`a.ref=b; b.ref=a`) #### 示例说明 ```python x = 256 # 使用小整数缓存对象 y = 257 # 创建新对象 print(id(x) == id(256)) # True (缓存复用) print(id(y) == id(257)) # False (每次新建) ``` > Python变量本质是内存对象的"便利贴",修改不可变对象相当于更换便利贴位置,修改可变对象相当于在原位置增删内容[^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值