为何示例II仅Tuple发生变化,示例I中两个List均被修改?
为什么列表赋值后修改会影响原变量,元组却不会?
这事儿核心在于Python里可变对象和不可变对象的本质区别,咱们一步步拆解来看:
示例I:列表的情况
先看这段代码:
L1 = [1,2,3,4] L2 = L1 L2.append(5) print("L1: ", L1) print("L2: ", L2)
输出是L1: [1,2,3,4,5]和L2: [1,2,3,4,5],原因是:
- 当你执行
L2 = L1时,并没有复制一个新的列表,而是让变量L2和L1指向内存中同一个列表对象。你可以用print(id(L1), id(L2))验证,两者的内存地址完全相同。 - 列表是**可变(mutable)**对象,
append(5)是直接在原列表对象上做修改——相当于给同一个“盒子”里加了个元素。既然L1和L2都盯着这个盒子,自然看到的都是修改后的结果。
示例II:元组的情况
再看元组的代码:
L1=(1,2,3,4) L2=L1 L2 += (5,) print("L1: ", L1) print("L2: ", L2)
输出是L1: (1,2,3,4)和L2: (1,2,3,4,5),原因正好相反:
- 同样,
L2 = L1一开始也是让L2指向原元组对象。但元组是**不可变(immutable)**对象——一旦创建就不能修改内部元素。 - 当你执行
L2 += (5,)时,Python没办法在原元组上添加元素,只能创建一个全新的元组:把原元组的(1,2,3,4)和新元素(5,)合并成(1,2,3,4,5),然后让L2指向这个新元组。而L1仍然指向原来的旧元组,所以两者输出不同。 - 同样用
id()验证:执行L2 += (5,)前,id(L1)和id(L2)相同;执行后,id(L2)会变成新的地址,id(L1)还是原来的。
总结一下核心区别
- 可变对象(列表、字典、集合等):赋值传递的是对象引用,修改操作会直接改变原对象,所有指向它的变量都会同步看到变化。
- 不可变对象(元组、字符串、数字等):赋值同样传递引用,但任何“修改”操作都会生成新对象,原对象保持不变,只有重新赋值的变量会指向新对象。
内容的提问来源于stack exchange,提问作者RAMAN BHATIA
相关产品推荐
相关产品推荐

