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

为何示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:52