列表赋值复制引用,修改影响原变量;元组赋值也复制引用,但“修改”实为新建对象,原变量不变;sort()就地排序返回None,sorted()返回新序列;默认参数用列表易出bug,元组更安全;元组嵌套可变对象时,内层仍可变。

列表和元组在赋值时的行为差异
直接用 = 赋值时,列表和元组都只是复制引用,不是深拷贝。但因为列表可变,后续修改会影响原变量;元组不可变,所以“修改”只能是重新赋值,不影响旧引用。
- 对列表做
list_b = list_a后执行list_b.append(1),list_a也会变 - 对元组做
tuple_b = tuple_a后执行tuple_b += (1,),实际是新建元组,tuple_a不变 - 想真正复制列表要用
list_a.copy()或list_a[:];元组无需深拷贝(内容不可变),但嵌套了可变对象时例外
为什么 list.sort() 没有返回值,而 sorted() 有
这是 Python 故意设计的信号:就地排序 vs 创建新序列。列表可变,所以 sort() 直接改原列表;元组不可变,压根没有 sort() 方法,只能靠 sorted() 返回新列表。
-
my_list.sort()返回None,错误写法:new_list = my_list.sort()(结果是None) -
sorted(my_tuple)总是返回list,不是元组;要转回元组得显式调用tuple(sorted(my_tuple)) - 性能上,
sort()原地操作更快、省内存;sorted()多一次拷贝,但不破坏原始数据
函数参数中传列表 vs 传元组的实际影响
函数内部能否修改参数,取决于你传的是什么类型,以及函数怎么写。但更关键的是——默认参数若用列表,会引发隐蔽 bug;元组则天然安全。
- 错误模式:
def add_item(item, lst=[]): lst.append(item); return lst—— 多次调用共享同一个[],结果累积 - 正确写法:
def add_item(item, lst=None): lst = lst or []或直接用元组作默认值(但元组不能.append,所以仅适用于只读场景) - 如果你只读不改,传元组能防止误操作,也向调用方传达“这个数据不该被改”的意图
嵌套结构里混用列表和元组的坑
元组不可变,是指它的“容器身份”不可变(长度、元素位置不能变),但若某个元素本身是列表,那个列表仍可修改——这点极易被忽略。
立即学习“Python免费学习笔记(深入)”;
-
t = ([1, 2], 'a')是合法元组,但t[0].append(3)可以成功,t还是同一个对象 -
json.dumps()要求顶层是 dict/list,不接受元组;但tuple作为 value 传进去会被自动转成list - 用作字典键时,必须所有嵌套层级都是不可变类型;含列表的元组(如
(['a'],))不能当 key,会报TypeError: unhashable type: 'list'
tuple。











