You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2.7中变量赋值后内存地址变化的原因问询

Python中变量赋值导致内存地址变化的原理

Python里的变量本质是指向内存对象的引用标签,不是用来存储值的容器,这是理解地址变化的核心。

不可变类型的特性

整数、字符串、元组这类属于不可变类型——它们的值一旦创建就无法被修改。当你给变量重新赋值时,并不是修改原来的对象,而是让变量指向一个全新的对象,自然内存地址(id)就会改变。

拿你简化后的代码举例:

var = 1
print(id(var), var)
var = 5
print(id(var), var)
  • 第一行var = 1:Python在内存中创建值为1的整数对象,让var这个标签指向它,此时id(var)返回的是这个1对象的内存地址。
  • 第三行var = 5:因为整数不可变,无法把原来的1改成5,Python会新创建一个值为5的整数对象,然后把var标签从原来的1对象上移到这个5对象上,所以id(var)变成了新对象的地址。

回到最初的列表解包例子

你一开始的列表解包代码:

arr = [1, 2, 3, 4]
[one, two, three, four] = arr
print(id(arr[0]), arr[0])
print(id(one), one)
one = 5
print(id(one), one)
  • 解包操作[one, ...] = arr本质是让one指向arr[0]对应的那个1对象,所以两者id相同。
  • 执行one = 5时,同样是让one指向新的5对象,和原来的arr[0]没有关系了,所以id改变,而arr里的1也不会受到影响。

补充:可变类型的区别

如果是列表、字典这类可变类型,修改对象内部元素时,变量的id不会变化,因为你是在修改原对象本身,而不是指向新对象:

lst = [1, 2]
print(id(lst))  # 输出某个地址
lst.append(3)
print(id(lst))  # 地址和之前一致

内容的提问来源于stack exchange,提问作者freedom35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:06:30