Python中整数与列表同为对象,为何赋值后修改行为不同?
为什么修改x后y的表现不同?
先看第一个代码片段:
x = 10 y = x x = x + 1
这里的10是不可变对象(整数属于Python的不可变类型)。执行y = x时,y和x指向同一个整数对象10。但x = x + 1并非修改原有10对象,而是创建了新的整数对象11,再让x指向这个新对象。y仍指向原来的10,所以y的值不会变化。
再看第二个代码片段:
x = [0, 1] y = x x.pop()
列表属于可变对象。y = x同样让y和x指向同一个列表对象[0,1]。而x.pop()是直接修改这个列表对象的内部状态(移除最后一个元素),由于y和x指向的是同一个对象,所以y也会呈现修改后的结果。
核心区别:不可变对象 vs 可变对象
- 不可变对象(整数、字符串、元组等):无法修改对象本身,任何看似修改的操作都会生成新对象。变量只是指向对象的引用,重新赋值会让变量指向新对象。
- 可变对象(列表、字典、集合等):可以直接修改对象的内部状态,所有指向该对象的变量都会同步看到这个变化。
本质:变量是引用,而非对象本身
Python中的变量本质是贴在对象上的"标签",不是对象的副本。当你把x赋值给y时,只是给同一个对象多添加了一个标签:
- 对不可变对象,你无法修改对象内容,只能让变量标签指向新的对象;
- 对可变对象,你可以直接修改对象的内部数据,所有指向该对象的标签都会反映出这个修改。
内容的提问来源于stack exchange,提问作者Almester Ali
相关产品推荐
相关产品推荐

