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
相关产品推荐
相关产品推荐

