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

Python创建二维网格时的Aliasing(别名)问题

为什么用[[0]*5]*5生成二维列表会导致所有行同步修改?

当你用lst = [0] * 5生成一维0列表时,这种方法是有效的——因为0是不可变对象,*运算符复制的是这些不可变对象的引用,即使多个位置指向同一个0,你后续修改列表元素时(比如lst[0] = 1),只是把该位置的引用换成了新的整数1,不会影响其他位置。

但换成grid = [[0] * 5] * 5生成二维网格时,逻辑就变了:

  1. 首先[0] * 5创建了一个包含5个0的可变列表对象;
  2. 然后* 5是把这个单个列表的引用复制了5次,放进外层列表里。

也就是说,grid中的5个"行",本质上都是指向同一个内层列表的指针。当你执行grid[0][0] = 1时,你是在修改这个唯一的内层列表的第一个元素,所以所有行都会显示出这个变化——因为它们本来就是同一个列表的不同引用。

而用grid = [[0] * 5 for _ in range(5)]就能解决问题,原因是列表推导式会循环5次,每次都创建一个新的[0]*5列表。外层列表里的每个元素都是独立的可变对象,修改其中一行时,只会影响该行对应的列表,其他行不受干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:40:33