Python二维列表用*初始化后修改对角线元素出现异常问题
为什么用
*初始化二维列表会出现意外结果? 嘿,这个问题我太熟了!很多刚接触Python列表的朋友都会踩这个坑😅
问题根源:列表的引用复制
你写的代码table = [([False]*5)]*5看起来是创建了5个包含5个False的子列表,但实际上这5个子列表都是同一个列表对象的引用。
当你用*运算符复制列表时,对于可变对象(比如列表),它复制的不是对象本身,而是指向该对象的引用。也就是说,[([False]*5)]*5做的事情是:
- 先创建一个列表
[False, False, False, False, False] - 然后把这个列表的引用重复5次,放进外层列表里
所以当你执行table[i][i] = 1(或者你预期的True)时,你其实是在修改那个唯一的子列表的元素,所有行都会同步变化——因为它们指向的是同一个东西!
正确的解决方法
要创建真正独立的子列表,你需要确保每次都生成一个新的列表对象,最常用的方式是列表推导式:
# 用列表推导式创建独立的子列表 table = [[False]*5 for _ in range(5)] for i in range(5): table[i][i] = True # 这里改成True和你的预期输出一致
这样,range(5)的每一次循环都会生成一个新的[False]*5列表,外层列表里的5个元素都是完全独立的对象,修改其中一个子列表的元素不会影响其他子列表。
你也可以用普通循环来实现,效果是一样的:
table = [] for _ in range(5): # 每次循环都新建一个子列表 table.append([False]*5) for i in range(5): table[i][i] = True
验证结果
运行上面的正确代码后,你就能得到预期的输出:
[[True, False, False, False, False], [False, True, False, False, False], [False, False, True, False, False], [False, False, False, True, False], [False, False, False, False, True]]
内容的提问来源于stack exchange,提问作者wanger
相关产品推荐
相关产品推荐

