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

Python中f = g = h = []为何永久关联?列表与整数赋值差异解析

解析Python链式赋值中列表与整数的行为差异

这是个非常经典的Python变量赋值和对象可变性问题,我来一步步给你讲明白:

1. 为什么f = g = h = []会让这些变量永久指向同一个列表?

在Python里,变量本质上更像是贴在对象上的标签,而不是用来存储数据的容器。链式赋值的执行逻辑是这样的:

  • 首先创建右边的空列表对象[],它会被分配一块内存空间;
  • 然后把f、g、h这三个标签全部贴到这个刚创建的列表对象上。

也就是说,这三个变量并没有各自“拥有”一个列表,它们只是同时指向了内存中的同一个列表对象。只要你没有给其中某个变量重新赋值(比如f = [2]这种操作会让f指向新的列表),它们就会一直关联着同一个对象。

你可以用id()函数验证这一点:

f = g = h = []
print(id(f))  # 输出某个内存地址
print(id(g))  # 和上面的地址完全相同
print(id(h))  # 同样的地址

2. 为什么f.append(1)会让三个变量都变成[1],而整数不会?

这就要说到Python中可变对象和不可变对象的核心区别了:

  • 列表属于可变对象:你可以直接在原对象的内存地址上修改它的内容(比如append、extend、pop这些操作),不需要创建新的对象;
  • 整数(还有字符串、元组等)属于不可变对象:一旦创建就无法修改它的内容,任何看似“修改”的操作,本质都是创建一个新的对象,然后让变量指向这个新对象。

列表的情况:

当你执行f.append(1)时,你并不是给f重新赋值,而是直接修改了f所指向的那个列表对象的内容。因为g和h也指向同一个对象,所以它们自然也能看到这个修改后的结果:

f = g = h = []
f.append(1)
print(f)  # 输出 [1]
print(g)  # 输出 [1]
print(h)  # 输出 [1]

整数的情况:

如果是整数的链式赋值,比如a = b = c = 1,当你执行a += 1时,因为整数不可变,Python会创建一个新的整数对象2,然后把a这个标签从原来的1上撕下来,贴到新的2上。而b和c依然指向原来的1,所以它们的值不会变:

a = b = c = 1
a += 1
print(a)  # 输出 2
print(b)  # 输出 1
print(c)  # 输出 1

简单总结一下:可变对象的修改是“原地修改”,所有指向它的变量都会同步变化;不可变对象的“修改”是创建新对象,只有被重新赋值的变量会指向新对象,其他变量不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:24:09