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
相关产品推荐
相关产品推荐

