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

Python中[[0]*9]*9初始化矩阵的运行原理及问题解析

Python列表乘法初始化矩阵的引用问题解释

你的猜测完全正确:[[0]*9]*9生成的外层列表中,所有行元素都指向同一个内层列表实例,因此修改任意一行的元素会同步反映在所有行上。

Python序列乘法的核心规则

对Python内置序列(列表、元组等)使用*做重复操作时,解释器不会递归复制序列中存储的元素本身,只会重复存储元素的内存引用,重复多少次就往新序列里放多少个指向同一个原元素的引用。

为什么[0]*9不会出现同类问题

[0]*9里重复存储的是整数0的引用,而整数是不可变类型:

  • 你修改列表某个位置的值时,本质是给该索引位置重新绑定了一个新的对象引用,不会改动原对象,也不会影响其他位置存储的引用。

对应逻辑示例:

row = [0] * 9
row[0] = 1
# 上面的操作只是把row[0]的引用从指向0改为指向1,其余8个位置依然存着指向0的引用,不会出现值联动

[[0]*9]*9的具体执行逻辑

这行代码的执行分两个先后步骤:

  1. 先计算内层表达式[0]*9,在内存中创建一个长度为9、全元素为0的列表对象,我们暂称它为single_row。
  2. 再计算外层表达式[single_row] * 9:创建一个长度为9的外层列表,里面存的9个元素全是指向single_row的引用,全程没有创建新的内层列表。

因此执行matrix[0][0] = 1时,你修改的是唯一存在的那个single_row的0号元素,而matrix[1]到matrix[8]全指向这同一个single_row,访问matrix[1][0]自然会拿到修改后的值1。

正确初始化独立行矩阵的写法

如果需要9个互相独立的行,需要通过推导式每次生成全新的内层列表,不要用乘法重复可变的列表对象:

# 每次循环都会重新执行[0]*9,生成独立的新内层列表
matrix = [[0] * 9 for _ in range(9)]
matrix[0][0] = 1
print(matrix[1][0])  # 输出0,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:29:00