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

Python二维数组预分配问题求助:为何[[0]*7]*6初始化失效?

问题原因解析

这是Python中列表引用机制导致的典型问题,核心差异在于两种初始化方式创建的列表对象是否独立:

1. [[0]*7]*6的问题本质

[0]*7会创建一个包含7个0的列表对象,而*6操作并没有为每一行生成新的列表,只是把同一个列表对象的引用重复了6次。也就是说,数组B的6个元素其实都指向内存中的同一个列表。

当你修改B中任意一行的元素时,比如执行B[0][0] = 1,所有行的对应位置都会跟着变化——因为它们本质上是在修改同一个底层列表。

示例代码验证:

B = [[0]*7]*6
B[0][0] = 5
print(B)
# 输出:[[5, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0]]

2. 手动逐行初始化的正确性

手动逐行初始化(比如B = [[0]*7 for _ in range(6)],或者逐行写[0]*7)时,每次循环/手动定义都会创建一个全新的列表对象。数组B的每一行都是独立的内存对象,修改其中一行不会影响其他行。

示例代码验证:

B = [[0]*7 for _ in range(6)]
B[0][0] = 5
print(B)
# 输出:[[5, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

总结

Python中,*操作符对可变对象(如列表)执行的是引用复制,而非对象复制。手动逐行初始化则会为每一行生成独立的列表对象,因此能实现预期的数组赋值效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:12:38