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

为什么Python中用[[]]*n生成的二维列表元素会互相影响?

核心原理

Python 中[x] * n的执行逻辑是:创建长度为n的新列表,其中每个元素都是同一个x对象的引用,并不会为每个元素重新生成新的x实例。

两种场景的差异

1. 元素为不可变对象(整数、字符串、元组等)

你第一个示例中的[0]*5,整数0属于不可变类型。后续执行l[0] = 1时,并不是修改原有0对象本身(不可变对象无法被修改),只是将列表第0位的引用替换为指向1的新内存地址,其他位置的引用仍然指向原有0,因此修改不会互相影响,输出符合预期。

2. 元素为可变对象(列表、字典等)

你第二个示例中的[[]]*5,空列表属于可变类型。此时生成的外层列表的5个元素,全部指向同一个空列表实例。执行l[0].append(1)、l[1].append(2)是直接修改这个公共列表实例的内容,所有指向该实例的位置都会同步显示修改结果,因此最终所有子列表内容完全一致。

生成独立子列表的简洁写法

使用列表推导式即可替代循环append,每次循环都会生成全新的独立空列表,不存在引用共享问题:

l = [[] for _ in range(5)]
l[0].append(1)
l[1].append(2)
print(l) # 输出 [[1], [2], [], [], []]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:04