Python创建二维网格时的Aliasing(别名)问题
为什么用
[[0]*5]*5生成二维列表会导致所有行同步修改? 当你用lst = [0] * 5生成一维0列表时,这种方法是有效的——因为0是不可变对象,*运算符复制的是这些不可变对象的引用,即使多个位置指向同一个0,你后续修改列表元素时(比如lst[0] = 1),只是把该位置的引用换成了新的整数1,不会影响其他位置。
但换成grid = [[0] * 5] * 5生成二维网格时,逻辑就变了:
- 首先
[0] * 5创建了一个包含5个0的可变列表对象; - 然后
* 5是把这个单个列表的引用复制了5次,放进外层列表里。
也就是说,grid中的5个"行",本质上都是指向同一个内层列表的指针。当你执行grid[0][0] = 1时,你是在修改这个唯一的内层列表的第一个元素,所以所有行都会显示出这个变化——因为它们本来就是同一个列表的不同引用。
而用grid = [[0] * 5 for _ in range(5)]就能解决问题,原因是列表推导式会循环5次,每次都创建一个新的[0]*5列表。外层列表里的每个元素都是独立的可变对象,修改其中一行时,只会影响该行对应的列表,其他行不受干扰。
内容的提问来源于stack exchange,提问作者Param
相关产品推荐
相关产品推荐

