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

关于Python元组不可变性两种表现差异的技术疑问

两段Python代码行为差异的原理解析

核心差异本质

这两段代码的行为区别,核心在于**「修改对象本身」和「重新绑定局部变量」**的本质不同,结合Python的参数传递规则与不可变对象定义就能理清。


代码片段1分析

def some_function_1(x):
  x[0] = 42

input = (3,)
_ = some_function_1(input)
print(input)

这段代码抛出TypeError的原因很明确:元组是不可变对象——这里的「不可变」指的是元组对象本身的内部结构/元素无法被修改。当执行x[0] = 42时,是直接尝试修改传入的元组对象的第一个元素,这违反了元组的不可变性规则,因此触发报错。


代码片段2分析

def some_function_2(x):
  x = 42

input = (3,)
_ = some_function_2(input)
print(input)

这段代码的两个关键行为可以拆解为:

  1. 为什么不报错?:x = 42并不是修改原元组对象,而是把函数内部的局部变量x,从原本指向传入的元组(3,),重新绑定到了新的整数对象42。这个操作完全没有触碰原元组对象,自然不会触发不可变性的限制。
  2. 为什么外部input不变?:Python的参数传递是传对象引用——函数内部的x只是原input变量的一个「引用副本」。当你在函数内给x赋值新对象时,只会改变这个局部引用的指向,不会影响外部input变量对原元组的引用。因此外部打印input时,仍然是最初的元组(3,)。

关于元组不可变性的总结

元组的「不可变性」约束的是对象本身,而不是「指向该对象的变量」:

  • 你不能修改元组对象的内部元素或结构(比如代码1的操作);
  • 但你完全可以把指向元组的变量重新赋值给其他对象(比如在函数外执行input = 42是合法的)。

代码1直接触碰了元组对象的不可变性限制,而代码2只是操作局部变量的引用,和原元组对象无关,这就是两段代码行为差异的根本原因。

内容的提问来源于stack exchange,提问作者Simon Righley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:27:37